专业网站策划 西安,wordpress新奇插件,潍坊企业建站系统,珠海网站设计公司Room数据库笔记
ORM框架#xff1a;对齐数据库数据结构与面向对象数据结构之间的关系#xff0c;使开发编程只考虑面向对象不需要考虑数据库的结构
Entity : 数据实体#xff0c;对应数据库中的表 完成面向对象与数据库表结构的映射 注解#xff1a;
类添加注解…Room数据库笔记
ORM框架对齐数据库数据结构与面向对象数据结构之间的关系使开发编程只考虑面向对象不需要考虑数据库的结构
Entity : 数据实体对应数据库中的表 完成面向对象与数据库表结构的映射 注解
类添加注解并指定与数据库中表的对应关系
Entity(tableName Book)
主键自增
PrimaryKey(autoGenerate true)
private int _id;
数据库字段名称字段类型 对应对象的属性
ColumnInfo(name card_name,typeAffinity ColumnInfo.TEXT)
private String cardName;
数据库忽略这种构造方法不需要数据库考虑的方法都使用Ignore注解
Ignore
public CardInfoAuditionEntity(String className, int mode) {this.className className;this.mode mode;
}DAO数据访问对象包含访问数据库的方法 完成数据库增删改查语句的映射 Query注解下的返回值可以是一个LiveData类型在Activity或者Fragment中监听这个LiveData值的变化执行刷新UI的操作
是一个接口类并且用Dao注解声明
Dao
// 数据库查询语句与Java中查询方法相对应
(查询语句返回值为LiveData类型Room数据库会在数据库的本条查询结果发生变更时触发setValue在Acticity或者Fragment中注册对返回结果值的监听完成界面刷新
Query(SELECT * FROM CardInfoAuditionEntity)
LiveDataListCardInfoAuditionEntity queryCardInfoAuditionLiveData();
// 数据库筛选查询useId与Java语句中的参数名要保持一致
Query(SELECT * FROM users WHERE id :userId)
User getUserById(int userId);
// Query注解可以使用其他的SQL语句进行查询
Query(SELECT COUNT(*) FROM users)
int getUserCount();
// Query注解可以使用时执行Delete语句等
Query(DELETE FROM users)
void deleteAllUsers();
// Delete注解该注解标记的方法用于从数据库中删除用户信息。
deleteUser(User user)删除用户信息返回删除的行数。
Delete
int deleteUser(User user);
// Update 注解该注解标记的方法用于更新数据库中的用户信息。
updateUser(User user)更新用户信息返回更新的行数
// 插入多条数据插入时插入的数据与已有的数据冲突替换
Insert(onConflict OnConflictStrategy.REPLACE)
void insert(CardInfoAuditionEntity... cardInfoAuditionEntity);
// Transaction注解等于数据库事务多条数据库SQL指令一起执行全部成功则插入数据库存在失败会回滚
Transaction
default void insertAll(ListCardInfoAuditionEntity entities) {for (CardInfoAuditionEntity entity : entities) {insert(entity);}
}Database数据库持有者
DataBase类是一个继承RoomDatabase的抽象类用注解Database声明
Database(entities {CardInfoPromotionEntity.class, CardInfoAuditionEntity.class, AppInfoEntity.class, FirstCreateStateEntity.class}, exportSchema false, version 1)
public abstract class LauncherDatabase extends RoomDatabase {
}
创建数据库
db Room.databaseBuilder(context.getApplicationContext(),LauncherDatabase.class, APP_INFO_DATABASE).addCallback(dbCallback).build();
引入Dao对象
public abstract CardInfoPromotionDao cardInfoPromotionDao();在调用Dao文件中方法时尽量不在主线程(也可以在主线程在创建数据库时传入一个参数可以使用AnsyTask总之要在子线程或者创建一个ExecutorService
数据库升级 创建 Migration 类对于每一次数据库版本的升级需要创建一个 Migration 类该类实现 Migration 接口 在构建 RoomDatabase 实例时将 Migration 实例添加到 RoomDatabase.Builder 的 addMigrations 方法中 在Database注解中声明当前数据库版本
Database(entities {User.class}, version 2).addMigrations(MIGRATION_1_2)// 从版本 1 升级到版本 2 的 Migration
static final Migration MIGRATION_1_2 new Migration(1, 2) {Overridepublic void migrate(SupportSQLiteDatabase database) {// 这里执行从版本 1 到版本 2 的数据库变更操作database.execSQL(ALTER TABLE User ADD COLUMN age INTEGER NOT NULL DEFAULT 0);}
};数据库升级异常捕获 使用 FallbackToDestructiveMigration升级版本号不合规或升级失败后数据库中数据被清空但不会引发系统崩溃
INSTANCE Room.databaseBuilder(context.getApplicationContext(),AppDatabase.class, app_database).fallbackToDestructiveMigration().build();数据库表结构修改使用数据迁移 1.先创建备用表期待修改后的表结构 2.之后将原有表中所有数据插入到备用表中 3.删除原有表 4.修改备用表的表名为原有表 Room数据库schema文件 记录每次数据库升级后表的结构 1.先设置exportSchema为true
Database(entities {CardInfoPromotionEntity.class, CardInfoAuditionEntity.class, AppInfoEntity.class, FirstCreateStateEntity.class}, exportSchema true, version 1)在build.gradle中配置文件生成位置
android {defaultConfig {javaCompileOptions {annotationProcessorOptions {arguments [room.schemaLocation: $projectDir/schemas.toString()]}}}
}加载数据库初始数据 在构建数据库过程中使用 createFromAsset 方法指定从 assets 文件夹中的预填充数据库文件创建数据库
INSTANCE Room.databaseBuilder(context.getApplicationContext(),AppDatabase.class, app_database).createFromAsset(prepopulated.db).build();