JetPack架构---ORM数据库Room的使用

Posted 战国剑

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JetPack架构---ORM数据库Room的使用相关的知识,希望对你有一定的参考价值。

Room 库在 android在sqlite 的基础上做的一个封装,让用户能更方便的使用数据库。

Room库实际与GreenDao数据库类似,优于GreenDao的是:

(1)Room库的sql语句,在编译时,编译器会做检查。

(2)整体上使用更方便,也因是官方库,会有更好的支持。

一、依赖

在build中新增依赖

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

二、简单使用

与通常使用数据库类似,定义好数据库、表、字段即可使用。

Room中定义,都是以注解方式标记,看上面依赖中的annotationProcessor即可知道,这些注解都将在编译时做处理,会根据注解生成数据库、表。

Room的写法与用法有特定格式:

(1)表与字段的定义

@Entity
public class RoomEntity 

    @PrimaryKey(autoGenerate = true)
    public int id;
    public String name;
    public String mark;
    @ColumnInfo(name = "student_")
    public boolean student;
    public int age;

常用注解标识:

@Entity标记使用上述结构生成一张表(Entity也可自定义表名、索引、是否忽略某列等)。

@PrimaryKey(autoGenerate = true),则表示字段自增长。

@ColumnInfo(name = "student_"),表示字段在表中的名称,无该注解,则使用字段本身作为字段名。

以上方式即定义好了表与字段,接着是数据库定义与使用。

(2)数据库定义与使用

2-0:Dao文件定义

首先定义好一个Dao文件,该文件即是操作数据文件,后续所有操作数据库的操作,都将在此处实现。

这是一个以@Dao注解为标识的接口。内部可通过表结果做增、删、改,也可以通过具体的sql语句,做增删改查。

如下所示,此处的sql语句,在编译时,编译器会检查正确性。

@Dao
public interface RoomDao 

    @Insert
    public long insert(RoomEntity entity);

    @Delete
    public int delete(RoomEntity entity);

    @Update
    public int update(RoomEntity entity);

    @Query("select * from RoomEntity where name= :name")
    public long queryByName(String name);

    @Query("update RoomEntity set age = :age  where name= :name")
    public int updateByName(String name,int age);

    @Query("select * from RoomEntity")
    public List<RoomEntity> queryAll();

    @Query("delete  from RoomEntity where name= :name")
    public int deleteByName(String name);

2-1:数据库的生成

新建一个数据库文件,以注解@Database标记。

该类是一个抽象类型的单例。

把需要对外展示的Dao文件,以抽象类的形式定义到类中,如 abstract RoomDao roomDao();经过编译后,该抽象类会与相应的方法实现自动绑定。

@Database(version = 1, entities = RoomEntity.class, exportSchema = false)
public abstract class RoomDataBase extends RoomDatabase 

    public abstract RoomDao roomDao();

    private static RoomDataBase roomDataBase;

    public static RoomDataBase instance() 
        if (roomDataBase == null) 
            synchronized (RoomDataBase.class) 
                roomDataBase =  Room
                        .databaseBuilder(WeatherApplication.globalContext, RoomDataBase.class, "app_database")
                        .allowMainThreadQueries()
                        .build();
            
        
        return roomDataBase;
    

这里需定义数据库的version版本、关联的表entities。

exportSchema设置为false则不会生成json结构文件,供用户查看

exportSchema设置为true,则需要指定导出的路径,会在该路径上生成json文件,文件内容是数据库结构。

//指定room.schemaLocation生成的文件路径
        javaCompileOptions 
            annotationProcessorOptions 
                arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]
            
        

2-3:如何使用

取得Dao文件,并操作Dao中的方法。

RoomDao dao = RoomDataBase.instance().roomDao()
RoomEntity entity = new RoomEntity();
entity.name = "张三";
entity.mark = "备注";
entity.age = 18;
entity.student = false;
dao.insert(entity);

 

三、Room的更多使用

Room本身还有更多复杂的使用,如表结构的嵌套、表关联、数据库的升级、降级等,可根据官方介绍使用。

以上是关于JetPack架构---ORM数据库Room的使用的主要内容,如果未能解决你的问题,请参考以下文章

Jetpack架构组件库:Room

Jetpack 总结系列- Google-Room数据库使用

Jetpack 总结系列- Google-Room数据库使用

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

Android Jetpack 学习之旅--> Room 的使用

Android jetpack的Paging和Room结合使用