我正在尝试将我们的项目迁移到使用Room,顺便说一句,我觉得这是一个很棒的进步.
我有以下结构:
public class Entity extends BaseObservable {
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "_id", typeAffinity = ColumnInfo.INTEGER)
private long mId;
@ColumnInfo(name = "is_dirty")
@TypeConverters(BooleanTypeConverter.class)
private boolean mIsDirty;
// default constructor and accessors omitted for brevity
}
@Entity(tableName = "some_entities")
public class SomeEntity extends Entity {
@ColumnInfo(name = "type", typeAffinity = ColumnInfo.TEXT)
private String mType;
@ColumnInfo(name = "timestamp", typeAffinity = ColumnInfo.INTEGER)
private long mTimestamp;
// constructor, accessors
}
Run Code Online (Sandbox Code Playgroud)
当我尝试编译我的项目时,它失败并没有特定的错误.
如果我尝试使用扁平实体层次结构编译它,一切都很好.
所以,我的主要问题是:Room是否支持实体继承?它是否能够从父Entity类中获取列定义?
我还想知道扩展BaseObservable(我需要使数据绑定工作)是否会导致Room出现问题?BaseObservable有一个私有瞬态字段,所以这可能会导致代码生成的一些问题.
是否有任何推荐的模式来处理这个问题,或者我是否只需要压缩我的实体层次结构?
这是我的用例:
我正在开发一个通过REST API与服务器通信的应用程序,并将接收到的数据存储在SQLite数据库中(它将其用作某些类型的缓存).
当用户打开屏幕时,必须进行以下操作:
这与此处介绍的情况非常相似,但略有不同.
由于我使用的SQLBrite,数据库可观不会终止(因为有一个ContentObserver注册了,是推动新的数据往下流),所以类似的方法concat,merge等将无法正常工作.
目前,我已使用以下方法解决了这个问题:
Observable.create(subscriber -> {
dbObservable.subscribe(subscriber);
apiObservable
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
.subscribe(
(data) -> {
try {
persistData(data);
} catch (Throwable t) {
Exceptions.throwOrReport(t, subscriber);
}
},
(throwable) -> {
Exceptions.throwOrReport(throwable, subscriber);
})
})
Run Code Online (Sandbox Code Playgroud)
它似乎工作正常,但它似乎并不优雅和"正确".
你能否建议或指出一个资源,解释什么是处理这种情况的最佳方法?