如何在Android中正确管理领域以进行数据绑定视图,但关闭所有领域实例?

问题描述 投票:0回答:1

如何在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体系结构组件得到正式支持。我在辩论的两面都看到人,但是我有什么特殊的理由应该远离会议室?

非常感谢您提供任何帮助或指导。

java android data-binding realm android-livedata
1个回答
0
投票

没有关于领域的好的文档,但是我可以与您分享我的经验:

  1. 您可以使用以下所有交易:

    /**
     * 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);

您可以在评论中提出更多问题

© www.soinside.com 2019 - 2024. All rights reserved.