前言
最近在项目中,使用了Google官方的ORM库Room。Room库Api设计类似Retrofit,非常简洁。在此记录其使用方法以及使用过程中碰到的一些问题。
Room使用介绍
gradle 依赖
Room在google的maven仓库,所以首先要添加Google的Maven仓库地址:
allprojects {
repositories {
jcenter()
maven { url 'https://maven.google.com' }
}
}
添加相关依赖项:
compile "android.arch.persistence.room:runtime:1.0.0"
apt "android.arch.persistence.room:compiler:1.0.0"
根据gradle选择使用apt或者annotationProcessor(apt需要添加 'android-apt'的gradle插件依赖)
ORM封装策略
Room的ORM可以分为如下三层:
可以看到,db这个包下可以分为三层。DownLoadDataBase 提供统一的对外接口,外部调用都通过这个类操作数据库。dao这个包,是数据库接口层(封装了增删改查的相关操作)。entity这个包,是数据库实体层(封装了数据库的表结构)。
ORM调用关系
- 首先定义数据库的表结构
@Entity(tableName = "serverdata")
public class ServerDataCache {
@PrimaryKey
@NonNull
@ColumnInfo(name = "video_id")
public String videoId;
@ColumnInfo(name = "server_json_data")
public String serverJsonData;
@ColumnInfo(name = "server_thumbnail_localpath")
public String serverThumbnailLocalPath;
@ColumnInfo(name = "is_valid")
public boolean isValid = false;
}
如上所示,上述代码定义了一张叫serverdata的表,有4个字段,主键是video_id。
- 定义操作数据库表的DAO
@Dao
public interface ServerDataCacheDao {
@Insert(onConflict = OnConflictStrategy.IGNORE)
void insert(ServerDataCache serverData);
@Update
void update(ServerDataCache serverData);
@Delete
void delete(ServerDataCache serverData);
@Query("SELECT * FROM serverdata WHERE video_id=:videoId AND is_valid=:isValid")
ServerDataCache getServerDataCacheByVideoId(String videoId, boolean isValid);
@Query("SELECT * FROM serverdata WHERE video_id=:videoId")
ServerDataCache getServerDataCacheByVideoId(String videoId);
@Query("SELECT * FROM serverdata WHERE is_valid=:isValid")
List<ServerDataCache> getServerDataCacheByValidState(boolean isValid);
}
- 将表关联到数据库,并暴露DAO的对外接口
@Database(entities = {ServerDataCache.class}, version = 1, exportSchema = false)
public abstract class DownloadDataBase extends RoomDatabase {
public abstract ServerDataCacheDao serverDataCacheDao();
}
Room相关注解的使用
- OnConflictStrategy
Room可以通过这个注解,定义插入等操作时的冲突解决方法
@Insert(onConflict = OnConflictStrategy.IGNORE)
Name | Meaning |
---|---|
Replace | replace the old data and continue the transaction |
Rollback | rollback the transaction |
Abort | abort the transaction |
Fail | fail the transcation |
Ignore | ignore the conflict |
- ForeignKey
外键支持
Room使用过程中碰到的问题
- 之前使用的是Room 的alpha版本,后面对Room的版本升级,编译运行崩溃,提示support v4的FragmentActivity找不到。对比了依赖树,依赖树的结构变了。解决方法:把Architecture Components的其他项也加上(lifecycle之类的),然后就好了~不知道为什么。
- Room1.0.0正式版使用的support library是26.0.0,可能会导致一些兼容性问题。强制将整个相关的support版本刷成了25.3.1.
网友评论