• Android Room数据库的集成与使用介绍


    背景:

    一、

    Room数据库是google官方提供的数据库,属于ORM库。

    Room与其他ORM框架对比有以下优点:

    1. 编译期检查,Room会在编译的时候验证每个@Query@Entity等,它不仅检查语法问题,还会检查是否有该表,这就意味着几乎没有任何运行时错误的风险
    2. 较少的模板代码
    3. 与 LiveData集成
       

    二、

    集成:

    依赖库:

    implementation "android.arch.persistence.room:runtime:1.1.1"
    kapt "android.arch.persistence.room:compiler:1.1.1"
    

    room:compiler库有人用 annotationProcessor引入,这个引入可能导致报错:Unable to load class com.google.auto.common.BasicAnnotationProcessor

    如果用kapt,如果你的项目支持kotlin,需要引入支持kotlin的插件

     

    三、

    引入room库,我们即将开发第一个demo的使用

    1.三大组件

    1.1:Entity=表库实体对象

    1.2:Dao:=查询模块,也就是sql语句,DDL和DML语言的控制类

    1.3Database=数据库类

     Entity:

    我们都知道数据库的表是字段关联数据。这个就很好理解,一条记录就是一个对象的熟悉,所以,我们创建一个表,就可以用Entity来标记。

    如下:

    @Entity(tableName = "user_db")
    public class UserEntity {
    
        /**
         * @Entity 实体类的标注,将会在数据库映射成对应的表结构,tableName不写,将会是实体类默认
         * @PrimaryKey 主键
         * @ColumnInfo 字段属性对应列的关系 没有该注解时,属性名将一一对应字段名
         * @Ignore 属性值将不会序列化为字段
         */
    
        @ColumnInfo(name = "age", typeAffinity = ColumnInfo.INTEGER)
        public int age;
        @ColumnInfo(name = "name")
        public String name = "";
        @ColumnInfo(name = "address")
        public String address = "";
        @ColumnInfo(name = "mobile")
        public String mobile = "";
        @PrimaryKey(autoGenerate = true)
        public int id;
    
    }

    我们创建了一个UserEntity实体,定义了一些数据。指定了主键和其他栏的基本信息

    如果我们没有设备ColumnInfo,那么被实例化如表的name就是字段的name,如果你要重新对熟悉在表中定义新的字段,那么可以如下

    @ColumnInfo(name = "m_mobile")

    public String mobile = "";

    如果设置主键:

    @PrimaryKey(autoGenerate = true)

    public int id;

    主键设置好了,入库以后,主键是自增,

    有人会问typeAffinity属性是什么意思?我们都知道如果没注明入库数据格式,默认都是String,如果想指定数据;类型,可以通过typeAffinity来标记

    默认是:UNDEFINED

    @Entity(tableName = "user_db"):指定该类为表,并指定一个表名(tableName )。

    正常上面的信息基本可以满足正常的需求。

    Dao:

    Dao在Java中是对数据的访问。在这边也是一样,提供对数据库的访问与操作,是对接口的修饰。

    @Dao
    public interface UserDao {
    
    
        @Query("select * from user_db")
        public List queryAll();
    
        @Query("select * from user_db where id=:id")
        public UserEntity findUserById(int id);
    
    
        @Update()
        public void updateUser(UserEntity entity);
    
        @Insert(onConflict = OnConflictStrategy.REPLACE)
        public long[] inserUser(UserEntity... entities);
    
        @Delete
        public void deleteUser(UserEntity entity);
    }

    这里面提供了对数据的基本操作如下,

    1.Query提供了查询,在Dao类创建之前,先处理好Entity表,因为在Dao操作中,如果引用了表,会自动去关联Entity的tabname,

    2.查询:在写条件查询时,字段连接参数如下

    id=:id,表中的字段名=:参数,不是我们写的id=id。

    3.插入Insert:onConflict冲突解决机制,onConflict = OnConflictStrategy.REPLACE

    public @interface OnConflictStrategy {
        /**
         * OnConflict strategy constant to replace the old data and continue the transaction.
         */
        int REPLACE = 1;
        /**
         * OnConflict strategy constant to rollback the transaction.
         */
        int ROLLBACK = 2;
        /**
         * OnConflict strategy constant to abort the transaction.
         */
        int ABORT = 3;
        /**
         * OnConflict strategy constant to fail the transaction.
         */
        int FAIL = 4;
        /**
         * OnConflict strategy constant to ignore the conflict.
         */
        int IGNORE = 5;
    
    }

    可以根据你的业务,自行添加标记。

    其他可自行研究

    3.Database

    数据库的创建:@Database(entities = {UserEntity.class}, version = 1)

    entities 括号里是表,就是我们用entity注入的标。最后一个参数是版本号。

    这里一张数据至少有一个表,括号里可以是多张表,这个表必须集成RoomDatabase,是一个抽象类,如下:

    @Database(entities = {UserEntity.class}, version = 1)
    public abstract class MyRoomDataBase extends RoomDatabase {
        public abstract UserDao getUserDao();
    
    }

    我们创建了一个自己的数据库,里面有一张表,在该数据库中,又创建了一个抽象的Dao,用来对数据的操作。

    以上三大核心已介绍完,接下来我们要做一个核心的操作,就是对项目进行build。如果项目执行成功,将会对Database和Dao类生成新的Impl类,如下:

    MyRoomDataBase_Impl类如下:

    对数据的动态创建,和对dao的生成。具体代码大家可自行去创建然后查看

     
    

    UserDao_Impl类如下:

    自动生成一些数据库的操作类还有就是我们定义了DDL操作方法,这些就是对sql语句的自动生成

    如果这两个类生成完,那我们的数据库基本完成。如果没有生成,那只有说明我们引用的有用。即使你去操作这些数据库,你也无法执行成功。

    四、

    数据的引用:

    连接数据库:

    MyRoomDataBase   dataBase = Room.databaseBuilder(this, MyRoomDataBase.class, "userDataBase").build();

      参数、 

      Context:直接传入

    Class klass:是数据库类@Databasex修饰的类
    name:数据库名字

    创建成功后才可以去操作数据库

    Dao操作数据都需要在子线程完成,因为Dao比较耗时,直接在UI线程操作,会报错

    UserEntity entity = new UserEntity();
    entity.address = "江苏南京";
    entity.age = 12;
    entity.mobile = "110";
    entity.name = "张傻";
    
    if (dataBase == null) {
        showToast("数据库初始化失败");
        return;
    }
    new Thread(new Runnable() {
        @Override
        public void run() {
            dataBase.getUserDao().inserUser(entity);
        }
    }).start();

    2.关于数据库自身的操作可以通过dataBase来操作,

    开:创建好也就是开启了

    关:dataBase.close()

    是否打开:dataBase.isOpen()

    数据库名字: dataBase.getOpenHelper().getDatabaseName()

    数据库版本号:dataBase.getOpenHelper().getReadableDatabase().getVersion()

    配置自己的事物:dataBase.beginTransaction();dataBase.endTransaction();

    对数据库的操作:可以通过创建databse来管理。

    以上基本就完成了对room数据库的基本操作

  • 相关阅读:
    Codeforces Round 895 (Div. 3)
    MinIO 图片转文件的分界线RELEASE.2022-05-26T05-48-41Z
    RunnerGo亮相QECon大会上海站,来看看这款全栈测试平台
    【Flutter】底部导航BottomNavigationBar的使用
    【考研】数据结构考点——顺序查找
    【QandA C++】内存泄漏、进程地址空间、堆和栈、内存对齐、大小端和判断、虚拟内存等重点知识汇总
    Sentinel授权规则和规则持久化
    连接命令文件.cmd
    Scala入门到精通(尚硅谷学习笔记)章节七——函数式编程
    【Qt之Model/View】编程
  • 原文地址:https://blog.csdn.net/qq36246172/article/details/126385379