Android Architecture Compone

作者: 三十二蝉 | 来源:发表于2017-11-17 16:58 被阅读480次

前言

最近在项目中,使用了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可以分为如下三层:

ORM分层.png
可以看到,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.

相关文章

网友评论

    本文标题: Android Architecture Compone

    本文链接:https://www.haomeiwen.com/subject/ietjvxtx.html