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 小时前
谷歌安卓 Gemini 迎来界面改版,Find Hub 接入 Gemini 支持物品记忆查找
android·安卓
YB13755 小时前
Jetpack Compose 动画Modifier.animateItem()
android
2401_885885046 小时前
巴林语音通知接口如何对接?系统告警语音API接入教程
android·前端·网络·python·语音识别
收纳过往7 小时前
数据库加索引的时机:慢查询日志说话
android·开发语言·数据库·python·低代码·rxjava
狂热开发者8 小时前
车载中控要给鸿蒙用户,能不能和 Android 共用一个二维码?
android·华为·harmonyos
.Bryce.8 小时前
T2-LLM评测不等于Agent评测
android·java·人工智能·后端·gpt·agent·1024程序员节
美狐美颜SDK开放平台9 小时前
视频美颜SDK如何应对快速转头与大幅度面部动作?
android·人工智能·ios·音视频·直播美颜sdk·视频美颜sdk
2601_968900779 小时前
玻璃深加工的工艺窗口:4 道工序的温度与时间参数边界
android·java·javascript
好的佩奇0110 小时前
Dart 之类修饰符
android·flutter·dart
YB137510 小时前
Jetpack Compose 动画Modifier.animateContentSize()
android