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);
相关推荐
安卓开发者11 小时前
Android RxJava 组合操作符实战:优雅处理多数据源
android·rxjava
阿华的代码王国11 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端
一条上岸小咸鱼11 小时前
Kotlin 基本数据类型(三):Booleans、Characters
android·前端·kotlin
Jerry说前后端11 小时前
RecyclerView 性能优化:从原理到实践的深度优化方案
android·前端·性能优化
alexhilton12 小时前
深入浅出着色器:极坐标系与炫酷环形进度条
android·kotlin·android jetpack
一条上岸小咸鱼18 小时前
Kotlin 基本数据类型(一):Numbers
android·前端·kotlin
Huntto18 小时前
最小二乘法计算触摸事件速度
android·最小二乘法·触摸事件·速度估计
一笑的小酒馆18 小时前
Android中使用Compose实现各种样式Dialog
android
红橙Darren18 小时前
手写操作系统 - 编译链接与运行
android·ios·客户端
鹏多多.1 天前
flutter-使用device_info_plus获取手机设备信息完整指南
android·前端·flutter·ios·数据分析·前端框架