android - 在 Clean Architecture 中管理 Realm 实例的最佳实践是什么?

标签 android realm

我的项目使用干净的架构。在这种情况下,UI 层与 Realm 层是分开的。所以我认为 UI 层最好不要拥有 Realm 实例。由于realm的文档建议在Activity的生命周期中管理realm实例,那么我应该如何处理realm实例呢?

更清楚地说,我的项目太重了,无法更改所有对象扩展 RealmObject。所以我使用单独的对象来持久化数据。当 api 调用完成时,业务对象转换为 Realm 对象,从 Realm 查询时相反。我创建这样的方法:

public void insert(T object){
    final Realm realm = RealmProvider.getRealm();
    realm.executeTransactionAsync(new Realm.Transaction() {
        @Override
        public void execute(Realm realm) {
            realm.copyToRealmOrUpdate(createRealmObject(object));
        }
    }, new Realm.Transaction.OnSuccess() {
        @Override
        public void onSuccess() {
            realm.close();
        }
    }, new Realm.Transaction.OnError() {
        @Override
        public void onError(Throwable error) {
            realm.close();
        }
    });
}

实际上,它工作得很好。但是下面我不知道如何处理关闭 Realm 实例。

public Observable<T> queryAsync(Condition<? extends RealmObject> condition) {
    final Realm realm = RealmProvider.getRealm();
    return condition.getQuery(realm).findFirstAsync()
            .asObservable()
            .filter(new Func1<RealmObject, Boolean>() {
                @Override
                public Boolean call(RealmObject realmObject) {
                    return realmObject.isLoaded();
                }
            })
            .map(new Func1<RealmObject, T>() {
                @Override
                public T call(RealmObject realmObject) {
                    return createObjectFromRealm(realmObject);
                }
            });
}

最佳答案

如果你想在你的代码中将 UI 层和数据库层完全分开,并且你想抽象出你的数据库逻辑,以便理想情况下你的 Activity 可以在不知道该层是如何实现的情况下调用数据库层,那么 Realm 可能不是什么你正在寻找。

Realm 对象与 realm 实例相关联,这意味着如果您从 realm 实例中检索对象然后关闭该实例(您必须这样做),您将无法再使用该对象。这违背了使用 Realm 的全部目的。

如果你打算使用 Realm,你应该保持 realm 逻辑与你的 Activity/服务等紧密相关,不要试图将它隐藏在一个单独的层中,这样你就可以完全控制它。


        .map(new Func1<RealmObject, T>() {
            @Override
            public T call(RealmObject realmObject) {
                Object o = createObjectFromRealm(realmObject);
                realm.close();
                return o;
            }
        });

关于android - 在 Clean Architecture 中管理 Realm 实例的最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38089581/

相关文章:

java - 将 java 示例从 GET 转换为 POST

java - 如何处理 "infinite"网页?

Android获取布局父id

RLMLinkingObjects 的 iOS 谓词( Realm )

ios - 如何按列表过滤 Realm 对象

java - LibGDX 0.9.9 - 在环境中应用立方体贴图

swift - 调试 Realm ,调用堆栈没有任何应用程序代码

xamarin - 从 Xamarin 捆绑预构建的 Realm 文件

java - 如何在一对一映射中不使用 null 实例化变量的情况下构建 Realm 数据库?

android - 使用 setNestedScrollingEnabled(false) 时如何避免阻止滚动本身?