Android数据存储:SQLite、Room

在Android平台上,集成了一个嵌入式关系型数据库—SQLite,SQLite3支持 NULL、INTEGER、REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型只有五种,但实际上sqlite3也接受varchar(n)、char(n)、decimal(p,s)等数据类型,只不过在运算或保存时会转成对应的五种数据类型。 SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,但是主键只能是Integer类型的。Sqlite数据库一般要求主键是_id,当然也可以是id。android里面的数据库是由底层的sqilte.c的代码来动态生成的。

Android Room 是 Android 官方提供的一个持久性库,用于在 Android 应用程序中管理数据库。它提供了一个对象关系映射(ORM)层,允许您在应用程序中使用对象来表示数据库表和数据行,并自动生成与之相关的SQL查询和操作。

Room使用

1.在build.gradle文件中添加依赖
def room_version = "2.6.1"

    implementation "androidx.room:room-runtime:$room_version"
    annotationProcessor "androidx.room:room-compiler:$room_version"

2.创建一个数据实体类:实体表示应用的数据库中的表。数据实体用于更新表中的行所存储的数据以及创建新行供插入。

使用 Room 实体定义数据  |  Android Developers (google.cn)

3.创建一个数据访问对象 (DAO):提供在数据库中查询、更新、插入和删除数据的方法。

使用 Room DAO 访问数据  |  Android Developers (google.cn)

4.创建一个数据库类:数据库类用于定义实体和数据访问对象的列表。它也是底层连接的主要访问点。

@Database(entities = {Student.class},version = 1,exportSchema = false)
public abstract class StudentDatabase extends RoomDatabase {


    public abstract StudentDao getStudentDao();

    private static StudentDatabase INSTANCE;
    public static synchronized StudentDatabase getInstance(Context context){
        if (INSTANCE == null){
            INSTANCE = Room.databaseBuilder(context.getApplicationContext(),StudentDatabase.class
                    ,"student_database")

                    .build();
        }

        return INSTANCE;
    }

}
  • 该类必须带有@Database注解,entities指明包含的实体, version表明版本,将 version 设为 1。每当更改数据库表的架构时,都必须提升版本号。将 exportSchema 设为 false,这样就不会保留架构版本记录的备份。
  • 该类必须是一个抽象类,用于继承RoomDatabase。
  • 对于与数据库关联的每个 DAO 类,数据库类必须定义一个具有零参数的抽象方法,并返回 DAO 类的实例。
  • 使用Room的Room.databaseBuilder创建数据库。不过,仅当该数据库不存在时才应创建。否则,请返回现有数据库。

5.创建一个类实现数据库异步操作

public class DBEngine {
    private StudentDao studentDao;

    public DBEngine(Context context) {
        StudentDatabase studentDatabase = StudentDatabase.getInstance(context);
        studentDao = studentDatabase.getStudentDao();
    }

    public void insertStudents(Student... students){
        new InsertAsyncTask(studentDao).execute(students);
    }

    public  void deleteStudents(Student... students){
        new DeleteAsyncTask(studentDao).execute(students);
    }

    public void updateStudents(Student... students){
        new UpdateAsyncTask(studentDao).execute(students);
    }

    public  void deleteAllStudent(){
        new DeleteAllAsyncTask(studentDao).execute();
    }

    public  void queryStudents(){
        new QueryAllAsyncTask(studentDao).execute();
    }

    //插入
    static class InsertAsyncTask extends AsyncTask<Student,Void,Void>{

        private StudentDao dao;

        public InsertAsyncTask(StudentDao studentDao) {
            dao = studentDao;
        }

        @Override
        protected Void doInBackground(Student... students) {
            dao.insertStudents(students);
            return null;
        }
    }

    //修改
    static class UpdateAsyncTask extends AsyncTask<Student,Void,Void>{
        private StudentDao dao;


        public UpdateAsyncTask(StudentDao studentDao) {
            dao = studentDao;
        }

        @Override
        protected Void doInBackground(Student... students) {
            dao.updateStudents(students);
            return null;
        }
    }

    //删除
    static   class DeleteAsyncTask extends AsyncTask<Student,Void,Void>{

        private StudentDao dao;

        public DeleteAsyncTask(StudentDao studentDao) {
            dao = studentDao;
        }

        @Override
        protected Void doInBackground(Student... students) {
            dao.deleteStudents(students);
            return null;
        }
    }

    //全部删除
    static class DeleteAllAsyncTask extends AsyncTask<Void,Void,Void>{

        private StudentDao dao;

        public DeleteAllAsyncTask(StudentDao studentDao){
            dao = studentDao;
        }

        @Override
        protected Void doInBackground(Void... voids) {
            dao.deleteAllStudents();
            return null;
        }
    }

    //全部查询
    static class QueryAllAsyncTask extends AsyncTask<Void,Void,Void>{

        private StudentDao dao;

        public QueryAllAsyncTask(StudentDao studentDao){
            dao = studentDao;
        }

        @Override
        protected Void doInBackground(Void... voids) {
            List<Student> allStudents = dao.getAllStudents();
            for (Student s : allStudents) {
                Log.e("search", "doInBackground:全部查询每一项"+ s.toString() );
            }
            return null;
        }
    }

6.MainActivity

public class MainActivity2 extends AppCompatActivity {

    private DBEngine dbEngine;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        dbEngine = new DBEngine(this);
    }

    public void insertAction(View view) {
        Student student = new Student("jerry",8);
        Student student1 = new Student("tom",9);
        Student student2 = new Student("jack",10);
        dbEngine.insertStudents(student,student1,student2);
    }

    public void deleteAction(View view) {
        Student student = new Student(null,0);
        student.setId(2);
        dbEngine.deleteStudents(student);
    }

    public void updateAction(View view) {
        Student student = new Student("lili",20);
        student.setId(3);
        dbEngine.updateStudents(student);
    }

    public void queryAction(View view) {
        dbEngine.queryStudents();
    }

    public void deleteAllAction(View view) {
        dbEngine.deleteAllStudent();
    }
}

相关推荐

  1. Android --- SQlite数据存储

    2024-03-28 06:20:02       30 阅读
  2. Android数据存储:SQLite、Room

    2024-03-28 06:20:02       48 阅读
  3. Android Studio学习笔记——数据库存储

    2024-03-28 06:20:02       28 阅读
  4. [Android]SharedPreferences可视化管理key-value数据存储

    2024-03-28 06:20:02       28 阅读
  5. Android学习之路之数据存储(二)

    2024-03-28 06:20:02       28 阅读
  6. 数据存储-文件存储

    2024-03-28 06:20:02       34 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-28 06:20:02       91 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-28 06:20:02       97 阅读
  3. 在Django里面运行非项目文件

    2024-03-28 06:20:02       78 阅读
  4. Python语言-面向对象

    2024-03-28 06:20:02       88 阅读

热门阅读

  1. 基于Python的旅游网站数据爬虫分析

    2024-03-28 06:20:02       36 阅读
  2. docker安装postgresql数据库包含postgis扩张

    2024-03-28 06:20:02       40 阅读
  3. [XG] HTTP

    [XG] HTTP

    2024-03-28 06:20:02      41 阅读
  4. 前端学习-CSS基础-Day2

    2024-03-28 06:20:02       38 阅读
  5. 机器学习:理论、方法与应用实践

    2024-03-28 06:20:02       41 阅读
  6. 机器学习(复试)

    2024-03-28 06:20:02       37 阅读
  7. TensorFlow 的基本概念和使用场景

    2024-03-28 06:20:02       37 阅读
  8. 逆流而上的选择-积极生活,逆流而上

    2024-03-28 06:20:02       33 阅读
  9. 面试中常被问到的数据库面试题及答案

    2024-03-28 06:20:02       49 阅读