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本身还有更多复杂的使用,如表结构的嵌套、表关联、数据库的升级、降级等,可根据官方介绍使用。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值