Android JetPack组件之Room数据库的集成与详解

Posted 蜗牛、Z

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android JetPack组件之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<UserEntity> 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<T> 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数据库的基本操作

以上是关于Android JetPack组件之Room数据库的集成与详解的主要内容,如果未能解决你的问题,请参考以下文章

Android jetpack room SQLLite 数据库 修改字段

Android jetpack room 记录数据库升级日志

Jetpack架构组件库:Room

Jetpack架构组件库:Room

Jetpack — AAC架构组件之Lifecycle

Android Jetpack简介