Room Database的简单使用

1 Room Database 简介

Room是SQLite之上的一个抽象层,通过Room,可以更加丝滑的使用SQLite的全部功能。并且,原本在运行期才能发现的SQL语句错误,现在在编译期就会报错,可以缩短SQL语句纠错的时间。

Room主要由以下三个部分组成:

  • DataBase(数据库): 用 Room.databaseBuilder() 或 Room.inMemoryDatabaseBuilder().方法获取DataBase实例。后者表示在内存中存储数据,如果程序结束了数据也就消失了,所以一般还是使用前者。

  • Entity(实体): 可以看成是数据库中的表

  • DAO(数据操作接口): 提供访问数据库的方法

2 简单使用

首先在Gradle中导入相关依赖

xml 复制代码
// Room (use 1.1.0-alpha1 for latest alpha)
implementation "android.arch.persistence.room:runtime:1.0.0"
annotationProcessor "android.arch.persistence.room:compiler:1.0.0"

2.1 创建Entity

java 复制代码
@Entity(tableName = "user_data_tab")
public class UserData {
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "id")
    private int id;

    @ColumnInfo(name = "cn_name")
    private String cnName;

    @ColumnInfo(name = "en_name")
    private String enName;

    get() && set() && toString()
}
  • 每个 Entity对象 都需要使用 @Entity 注解声明,默认使用类名作为表名,也可以指定表名

  • @PrimaryKey 注解用于声明主键,autoGenerate = true,表示它是自增的

  • @ColumnInfo 注解用来给属性设置别名,如果 cnName 属性不设置别名的话,查询的时候可以通过 cnName 进行查询,设置别名后就可以通过设置的 cn_name 进行查询

2.2 创建Dao

java 复制代码
@Dao
public interface UserDao {
    @Query("SELECT * FROM user_data_tab")
    List<UserData> getAll();

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void insert(UserData... userData);
}
  • Dao可以是 interface 也可以是 abstract类,如果是abstract类,需要提供一个参数为RoomDatabase的构造函数。Room会在编译器自动我们生成DAO的实现类
  • @Query 注解是DAO中最重要的注解,每一个@Query方法都在编译期生成,如果查询语句有误的话,会在编译期报错,而不是运行期操作失败。

2.3 创建 DataBase

java 复制代码
@Database(entities = {UserData.class}, version = 1)
public abstract class UserDataBase extends RoomDatabase {
    public abstract UserDao getUserDao();
}

由于实例化一个 RoomDatabase 对象的开销是比较大的,所以 DataBase 的使用需要遵循单例模式,只在全局创建一个实例即可。可以创建一个 DataBaseManager 类去进行管理

java 复制代码
public class UserDataBaseManager {
    private static UserDataBaseManager dataBaseManager;
    private UserDataBase mUserDataBase;
    private UserDao mUserDao;
    
    public static UserDataBaseManager getInstance() {
        if (dataBaseManager == null) {
            dataBaseManager = new UserDataBaseManager();
        }
        return dataBaseManager;
    }

    public void init(Context context) {
        if (mUserDataBase == null) {
            mUserDataBase = Room.databaseBuilder(
                    context.getApplicationContext(), UserDataBase.class, user_data.db)
                    .allowMainThreadQueries()
                    .fallbackToDestructiveMigration()
                    .build();
            mUserDao = mUserDataBase.getUserDao();
        }
    }

    public List<UserData> getAll(){
        return mUserDao.getAll();
    }

    public void insertAll(UserData... userData) {
        mUserDao.insert(userData);
    }
}
  • @Database 注释用于进行声明,同时还需要有相关的 entity对象 ,其中 version 是当前数据库的版本号,如果你对数据相关的实体类结构 进行了更改,这里的 version 就需要加一

  • BookDataBase 除了继承于 RoomDatabase ,还需要实例出相关的 DAO接口

2.3 测试

java 复制代码
mDataBaseManager = UserDataBaseManager.getInstance();
mDataBaseManager.init(this);


UserData userData = new UserData();
userData.setCnName("");
mDataBaseManager.insertAll(userData);

List<UserData> data = mDataBaseManager.getAll();
Log.d(TAG, "onCreate: data ="+data);
相关推荐
笑一下蒜了.3 分钟前
Linux 存储多路径访问手册|multipath.conf 各配置段详解
android·linux·运维
凡泰AI7 分钟前
如何通过小程序多端框架,让一个小程序同时运行在iOS、安卓、鸿蒙以及PC客户端,实现一次开发多端运行的效果
android·ios·小程序
一笑的小酒馆1 小时前
Androidiot扫地机器人设备详情页地图加载慢卡顿优化方案
android
Zhu7587 小时前
在k8s集群部署MySQL单实例,支持多个主流发行版
android·mysql·kubernetes
AFinalStone10 小时前
Android 7系统异常问题排查(四)Framework层(上)—System Server Watchdog
android·系统异常
宝杰X711 小时前
Android Room3 多平台数据库
android·数据库
huibin14785236914 小时前
热缓解学习记录
android·学习
小田的博客17 小时前
SAP MM 供应商银行主数据更新报错!message R1228!
android·java·服务器
一笑的小酒馆18 小时前
Android智能猫砂盆视频加载慢卡顿问题分析
android
只会cv的小前端20 小时前
七巧低代码服务端脚本使用方法
android·低代码·rxjava