Android 数据库之 Room(五)
程序员文章站
2024-03-17 13:47:16
...
Android 数据库之 Room(五)
一、简介
Room 是 Google 推出的数据库框架。该持久型类库在SQLite的基础上提供了一个抽象层,允许流畅的访问SQLite数据库,全面强大的直接SQLite。
- SQL 查询在编译期就会验证;
- 较少的模板代码;
- 支持 LiveData 集成。
二、集成
- 在项目级别的
build.gradle
中:
buildscript {
repositories {
maven {
url "https://maven.google.com"
}
// 或 google()
}
}
allprojects {
repositories {
maven {
url "https://maven.google.com"
}
// 或 google()
}
}
- 在模块级别(如
app
模块)的build.gradle
中:
apply plugin: 'com.android.application'
// 或者 apply plugin: 'com.android.library'
android {
defaultConfig {
javaCompileOptions {
annotationProcessorOptions {
// room的数据库概要、记录
arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]
}
}
}
}
dependencies {
compile 'androidx.room:room-runtime:2.0.0'
annotationProcessor 'androidx.room:room-compiler:2.0.0'
}
三、架构分析
Room 主要有3个部分:
- Database : 包含数据库持有者,并作为应用程序持久关系数据的基础连接的主要访问点。
- DAO : 数据库访问对象,实现具体的增删改查。
- Entity : 具体的bean实体,会与数据库表column进行映射。
引入代码:
- 引入 Database 类:
@Database(entities = {SimpleEntity.class, SimpleIndexedEntity.class},
version = 1, exportSchema = false)
public abstract class NormalDatabase extends RoomDatabase {
public abstract SimpleEntityDao getSimpleEntityDao();
public abstract SimpleIndexedEntityDao getSimpleIndexedEntityDao();
}
- 引入 DAO 类:
@Dao
public interface SimpleEntityDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
void insertMultiObjects(List<SimpleEntity> list);
@Delete
void deleteMultiObjects(List<SimpleEntity> list);
@Update
void updateMultiObjects(List<SimpleEntity> list);
@Transaction
@Query("SELECT * FROM simple_entity WHERE simpleInt = :simpleInt")
List<SimpleEntity> queryBySimpleInt(int simpleInt);
}
- 引入 Java Bean 类:
@Entity(tableName = "simple_entity")
public class SimpleEntity {
@PrimaryKey(autoGenerate = true)
long _id;
boolean simpleBoolean;
byte simpleByte;
short simpleShort;
int simpleInt;
long simpleLong;
float simpleFloat;
double simpleDouble;
String simpleString;
byte[] simpleByteArray;
}
四、封装Room示例
五、示例代码
public class RoomUtils {
private static Map<String, BaseDao> daoManagers;
@SuppressLint("StaticFieldLeak")
private static Context context;
public static void init(Context context) {
RoomUtils.context = context.getApplicationContext();
if (daoManagers == null) {
daoManagers = new ConcurrentHashMap<>();
}
}
public static SimpleEntityManager getSimpleEntityManager() {
SimpleEntityManager manager = (SimpleEntityManager) daoManagers.get(SIMPLE_ENTITY);
if (null == manager) {
manager = new SimpleEntityManager(context);
daoManagers.put(SIMPLE_ENTITY, manager);
}
return manager;
}
public static void closeAllDataBase() {
if (daoManagers != null && !daoManagers.isEmpty()) {
for (BaseDao baseDao : daoManagers.values()) {
baseDao.closeDataBase();
}
daoManagers = null;
}
}
}
public class SimpleEntityManager extends BaseDao<SimpleEntity> implements SimpleEntityDao {
private SimpleEntityDao mDao;
public SimpleEntityManager(Context context) {
super(context);
mDao = mDatabase.getSimpleEntityDao();
}
// 增、删、改、查
}
@Dao
public interface SimpleEntityDao {
// 增
@Insert(onConflict = OnConflictStrategy.REPLACE)
void insertMultiObjects(List<SimpleEntity> list);
}
@Dao
public interface SimpleEntityDao {
// 删
@Delete
void deleteMultiObjects(List<SimpleEntity> list);
}
@Dao
public interface SimpleEntityDao {
// 改
@Update
void updateMultiObjects(List<SimpleEntity> list);
}
@Dao
public interface SimpleEntityDao {
// 查
@Query("SELECT * FROM simple_entity WHERE _id = :id LIMIT 1")
SimpleEntity queryById(long id);
}
六、使用测试
注:可能因为具体测试机器不同,测试结果会有波动。下面的测试结果是用HuaWei Mate10测试的。