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);
相关推荐
顾北川_野17 分钟前
Android CALL关于电话音频和紧急电话设置和获取
android·音视频
&岁月不待人&27 分钟前
Kotlin by lazy和lateinit的使用及区别
android·开发语言·kotlin
Winston Wood2 小时前
Android Parcelable和Serializable的区别与联系
android·序列化
清风徐来辽2 小时前
Android 项目模型配置管理
android
帅得不敢出门3 小时前
Gradle命令编译Android Studio工程项目并签名
android·ide·android studio·gradlew
problc3 小时前
Flutter中文字体设置指南:打造个性化的应用体验
android·javascript·flutter
帅得不敢出门14 小时前
安卓设备adb执行AT指令控制电话卡
android·adb·sim卡·at指令·电话卡
我又来搬代码了16 小时前
【Android】使用productFlavors构建多个变体
android
德育处主任17 小时前
Mac和安卓手机互传文件(ADB)
android·macos
芦半山17 小时前
Android“引用们”的底层原理
android·java