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入门到项目实战--4.5】------ SQLite数据库存储实现增删改查_android sqlite数据库增删改查-CSDN博客

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

Room使用
1.在build.gradle文件中添加依赖

java 复制代码
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.创建一个数据库类:数据库类用于定义实体和数据访问对象的列表。它也是底层连接的主要访问点。

java 复制代码
@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.创建一个类实现数据库异步操作

java 复制代码
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

java 复制代码
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 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台1 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone1 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc1 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo1 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077001 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼1 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone1 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen1 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone1 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui