Room 是Google简化Sqlite专门提供的封装框架。
拥有Sqlite的所有功能
使用简单,通过注解的方法实现相关功能,类似于GreenDao,编译时自动生成实现类。
支持LiveData LifeCycle Paging
implementation 'android.arch.persistence.room:runtime:1.1.1'
implementation "android.arch.lifecycle:extensions:1.1.1"
annotationProcessor 'android.arch.persistence.room:compiler:1.1.1'
annotationProcessor "android.arch.lifecycle:compiler:1.1.1"
创建一个抽象类继承RoomDatabase对象,静态代码块,初始化数据库对象,三个参数,1-上下文,2-当前对象,3-数据库名称。下面还有针对数据库的配置。
@Database(entities = {Cache.class}, version = 1,exportSchema =true)
public abstract class CacheDatabase extends RoomDatabase {
private static final CacheDatabase database;
static {
//创建一个内存数据库
//但是这种数据库的数据只存在于内存中,也就是进程被杀之后,数据随之丢失
//Room.inMemoryDatabaseBuilder()
database = Room.databaseBuilder(AppGlobals.getApplication(), CacheDatabase.class, "cache")
//是否允许在主线程进行查询
//.allowMainThreadQueries()
//数据库创建和打开后的回调
//.addCallback()
//设置查询的线程池
//.setQueryExecutor()
//room的日志模式
//.setJournalMode()
//数据库升级异常之后的回滚
//.fallbackToDestructiveMigration()
//数据库升级异常后根据指定版本进行回滚
//.fallbackToDestructiveMigrationFrom()
//数据库迁移 监听 ,可以进行修改
// .addMigrations(CacheDatabase.sMigration)
.build();
}
public static CacheDatabase get() {
return database;
}
// 获取操作对象
public abstract CacheDao getCacheDao();
}
其中,exportSchema =true是日志模式,要实现配置
build.gradle–>android–>defaultConfig里
javaCompileOptions{
annotationProcessorOptions{
arguments=["room.schemaLocation":"$projectDir/schemas".toString()]
}
}
.addMigrations
迁移涉及到数据库升级的字段改变。
// 添加功能
.addMigrations( sMigration)
// 具体实现
static Migration sMigration = new Migration(1, 3) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
database.execSQL("alter table teacher rename to student");
}
};
@Entity
public class Cache implements Serializable {
@PrimaryKey
String key;
byte[] data;
}
@Dao
public interface CacheDao {
@Insert(onConflict = OnConflictStrategy.ABORT)
void insert(Cache cache);
@Query(("select * from cache where 'key'= :key"))
Cache getCache(String key);
@Delete
long delete(Cache cache);
@Update(onConflict = OnConflictStrategy.ABORT)
void update();
}
@Database 数据库的主对象
@Database(entities = {Cache.class}, version = 1,exportSchema =true) entities 是个数组,涉及哪些表,版本号、导出升级的数据库日志。
@columnInfo(name="info") 更改列的名字
@Dao 操作数据库的对象,如:增删改查
@Embedded 嵌套对象
@Entity 表的对象
@PrimartKey 主键
@Delete 删除
@Ingore 忽略在数据库产生列
@Index 加快查询操作,副作用减慢插入或者更新
@Foreignkey 外键关联
@Tranation
@TypeConverter
Dao
注解—涉及具体查询方法,是个接口,编译的时候自动生成实现类。
@Dao
public interface CacheDao {
@Insert(onConflict = OnConflictStrategy.ABORT)
void insert(Cache cache);
@Query(("select * from cache where 'key'= :key"))
Cache getCache(String key);
@Delete
long delete(Cache cache);
@Update(onConflict = OnConflictStrategy.ABORT)
void update();
}
冲突策略
增加和修改的时候,有可能已经存在的数据,OnConflictStrategy 就是解决这种情况的冲突策略。
int REPLACE = 1;
/**
* OnConflict strategy constant to rollback the transaction.
* 回滚
*/
int ROLLBACK = 2;
/**
* OnConflict strategy constant to abort the transaction.
* 放弃
*/
int ABORT = 3;
/**
* OnConflict strategy constant to fail the transaction.
*/
int FAIL = 4;
/**
* OnConflict strategy constant to ignore the conflict.
*/
int IGNORE = 5;
foreignKeys
主要是为了和其他对象有关联的时候使用。下面这句就是当前对象和User对象进行对象,都是通过各自的id进行关联。onDelete 和onUpdate 使用的外键策略。这个策略主要针对当前的表数据的变化引起关联表的变化的策略机制。
@Entity(tableName = "cache",
foreignKeys = {@ForeignKey(entity = User.class,parentColumns = "id",childColumns = "id", onDelete = ForeignKey.RESTRICT,onUpdate = ForeignKey.RESTRICT)})
ForeignKey:
int NO_ACTION = 1; 不处理
int RESTRICT = 2; 若主表删除,相关的关联表立即也删除。
int SET_NULL = 3; 设置null
int SET_DEFAULT = 4; 设置默认值
int CASCADE = 5; 类似RESTRICT,与之相关的每个关联表都响应。
CacheDatabase.getCacheDatabase().getCacheDao().insert(cache);
CacheDatabase.getCacheDatabase().getCacheDao().delete(cache);