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);
相关推荐
丘狸尾1 小时前
[cisco 模拟器] ftp服务器配置
android·运维·服务器
van叶~3 小时前
探索未来编程:仓颉语言的优雅设计与无限可能
android·java·数据库·仓颉
Crossoads7 小时前
【汇编语言】端口 —— 「从端口到时间:一文了解CMOS RAM与汇编指令的交汇」
android·java·汇编·深度学习·网络协议·机器学习·汇编语言
li_liuliu8 小时前
Android4.4 在系统中添加自己的System Service
android
C4rpeDime10 小时前
自建MD5解密平台-续
android
鲤籽鲲12 小时前
C# Random 随机数 全面解析
android·java·c#
m0_5485147716 小时前
2024.12.10——攻防世界Web_php_include
android·前端·php
凤邪摩羯16 小时前
Android-性能优化-03-启动优化-启动耗时
android
凤邪摩羯16 小时前
Android-性能优化-02-内存优化-LeakCanary原理解析
android
喀什酱豆腐17 小时前
Handle
android