我在
Android应用程序中尝试Realm.io,为了保持安全,我想抽象数据库层,以便在需要时我可以切换回基于标准sqlite的数据库而无需重写大多数应用程序.
然而,由于它的特殊性,我发现很难正确地抽象Realm:
>当绑定到领域时,RealmObjects是代理,所以我不能传递它们,因为它们是POJO.
>所有Realm实例都需要针对它们使用的每个线程正确打开和关闭.
我已经使用最近的Realm.copyFromRealm()API而不是传递绑定到Realm的RealmObjects来解决这些限制,但这样我觉得我失去了使用域的所有好处(我呢?).
有什么建议?
解决方法
我会尽力回答你的第一个困惑.
实际上没有必要通过意图传递RealmObjects,或者在其他方面不需要它们是可分区的或可序列化的
实际上没有必要通过意图传递RealmObjects,或者在其他方面不需要它们是可分区的或可序列化的
您应该做的是通过intent传递特定主要ID或该特定RealmObject的其他参数,以便您可以在下一个活动中再次查询该RealmObject.
例如,假设您在启动活动时传递primaryId,
Intent intent = new Intent(this,NextActivity.class); intent.putExtra(Constants.INTENT_EXTRA_PRIMARY_ID,id);
现在在NextActivity里面从intent获取id并简单地查询RealmObject,即
int primaryId = getIntent().getIntExtra(Constants.INTENT_EXTRA_PRIMARY_ID,-1); YourRealmObject mObject = realm.where(YourRealmObject.class).equalTo("id",primaryId).findFirst();
看,你在新的活动中得到了你的对象,而不是担心传递对象.
我不知道你打开和关闭领域对象有什么特别的问题.您是否尝试过Realm的Transaction块?如果使用它,则无需依赖打开和关闭.
我希望这有帮助.
更新
既然你在寻找抽象,
只需创建一个类似DbUtils的类,并在其中有一个方法,如getYourObjectById,然后传递上面的id并检索您的对象作为回报.这使它在某种程度上变得抽象.然后,您可以保留该类和方法,如果您切换到另一个数据库解决方案,只需更改方法内容.