如何在Android中正确地管理领域,以确保最终关闭所有数据库实例,但保持打开的时间足够长,以便查看对DataBind的托管对象并观察更改?
我想知道与Realm实例进行交互时是否存在最佳实践,该实践可以确保可以观察到数据,而且可以正确关闭对数据库的每个引用。我一直在寻找解决此问题的好方法,但到目前为止,这似乎是Realm的一个主要下降点,还是一个保密的秘密。在先前的项目中,当我与数据库交互时,我没有正确关闭Realm实例,这最终导致了巨大的麻烦,并进一步进行了重构。
我正在开始一个新项目,并希望确保一开始就正确设置了所有内容。我正在使用的应用程序将收到推送通知,这些通知将触发服务器的更新并将更改存储在数据库中。我想用Realm观察数据库中的相关数据,以便在更改数据库时可以自动更新数据绑定视图。如果我错了,请纠正我,但我的理解是,要观察数据库,从中获取数据的Realm实例必须保持打开状态。这意味着我无法通过单个存储库来打开新的Realm实例,无法获取所需的模型,然后将其传递回去,因为我将无法观察到更改。
我想出的解决方案是用三种与数据库交互的方式创建一个存储库层。这三个选项是复制,更新和收听。复制和更新功能将在单个块内打开和关闭领域实例,如下所示:
public RealmObject copyOrUpdate() {
Realm realm = Realm.getDefaultInstance()
try {
// Transaction
} finally {
realm.close()
}
}
但是,当我需要观察模型时,由于观察到的视图被销毁之前数据库将关闭,因此无法使用它。因此,为了跟踪领域实例,当我创建每个需要可观察的ViewModel时,我将打开一个新实例。然后,当我需要一个托管对象时,我将在以下区域中传递领域实例:
public RealmObject observeObject(Realm realm) {
return // Managed object
}
最后在销毁View并清除ViewModel时关闭Realm实例。从我目前对Realm的理解来看,老实说,我无法想到另一种或更好的方式来做到这一点,并且从在线阅读中,我找不到其他人遇到相同或相似的问题,但这篇帖子没有答案:
How to properly separate Realm from the rest of the app?
任何帮助,见解或建议,将不胜感激,这样我可以增进对Realm的了解,并避免头疼。
我还想知道观察Realm数据库的最佳方法,因为Realm似乎不提供对LiveData的支持,并且注册/注销RealmChangeListeners似乎是一种意外等待。有没有官方支持的处理LiveData的方法,或者我需要学习正确使用RealmChangeListeners吗?最后,过去使用Room取得了很多成功,并且感觉它是一个更好的解决方案,因为它已作为Android体系结构组件得到正式支持。我在辩论的两面都看到人,但是我有什么特殊的理由应该远离会议室?
非常感谢您提供任何帮助或指导。
没有关于领域的好的文档,但是我可以与您分享我的经验:
您可以使用以下所有交易:
/**
* insert or update your model in data base
* @param basemodel what u want to insert
*/
public void insertOrUpdate(RealmModel basemodel){
try {
realm = Realm.getDefaultInstance();
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
realm.insertOrUpdate(basemodel);
}
});
} finally {
if(realm != null) {
realm.close();
}
}
}
并且在课堂上可以看到这个:
public class MyRealm {
Realm realm = null;
public RealmModel results = new RealmModel();
Context context;//optional
因此您可以为领域作业构建一个类,以进行插入,更新,删除和读取以及您想要从领域中获取的任何内容
2。领域中的配置太重要了,您必须创建一个类并从应用程序类扩展,像这样:
public class MyApplication extends Application {
byte[] key = new byte[64];
private byte[] createRealmKey() {
byte[] key = new byte[64];
SecureRandom secureRandom = new SecureRandom();
secureRandom.nextBytes(key);
return key;
}
@Override
public void onCreate() {
super.onCreate();
if (key == null) {
key=createRealmKey();
}
Realm.init(this);
RealmConfiguration config = new RealmConfiguration.Builder()
.name("name.realm")
.schemaVersion(1)
.encryptionKey(key)
.deleteRealmIfMigrationNeeded()
.build();
Realm.setDefaultConfiguration(config);
}
这是用于加密数据和schemaVersions的领域配置,对您有用。
现在您的答案在这里:如果您以正确的方式使用类和RealmModel,则可以将其与诸如databinding和rx之类的所有东西一起使用]
请参阅这份工作:
RealmModel baseRealmModel = new new RealmModel();
baseRealmModel = myRealm.realmQueryOfRealmModel();//return a
////realm object for you that can do all with it
baseRealmModel.setUser(realmUser);
myRealm.insertOrUpdate(baseRealmModel);
您可以在评论中提出更多问题