领域不一致的结果

Realm Inconsistent results

在我的项目中,我使用的是干净的架构。以下代码位于我的域和数据层中。它是一个通用的实现,所以我不必为每个模型重复它。这段代码工作正常,我已经测试了一百万次。但是在发布我的应用程序之后,一些手机(华为 p8)在数据库中遇到了奇怪的行为。一旦我从某个 activity 调用 getList(X) 结果很好,然后我转到另一个 activity 进行相同的调用但响应为空。有时我会收到一个额外的项目,它只是充满了空值和默认值。我正在使用领域插件 1.2。我真的需要修复这个错误。我将不胜感激任何帮助。

@Override
public Observable getList(@NonNull GetRequest genericUseCaseRequest) {
    return mRepository.getListDynamically(genericUseCaseRequest.getUrl(), genericUseCaseRequest
            .getPresentationClass(), genericUseCaseRequest.getDataClass(), genericUseCaseRequest
            .isPersist(), genericUseCaseRequest.isShouldCache()).compose(applySchedulers());
}

@Override
public Observable<List> getListDynamically(@NonNull String url, Class presentationClass, @NonNull Class dataClass,
                                           boolean persist, boolean shouldCache) {
    try {
        return mDataStoreFactory.dynamically(url, true, mEntityMapperUtil.getDataMapper(dataClass))
                .dynamicGetList(url, presentationClass, dataClass, persist, shouldCache);
    } catch (IllegalAccessException e) {
        e.printStackTrace();
        return Observable.error(e);
    }
}

public DataStore dynamically(@NonNull String url, boolean isGet, EntityMapper entityDataMapper) throws IllegalAccessException {
    if (!url.isEmpty() && (!isGet || Utils.isNetworkAvailable(mContext)))
        return new CloudDataStore(new RestApiImpl(), mDataBaseManager, entityDataMapper);
    else if (mDataBaseManager == null)
        throw new IllegalAccessException(getInstance().getContext().getString(R.string.no_db));
    else
        return new DiskDataStore(mDataBaseManager, entityDataMapper);

}

@Override
public Observable<List> getAll(Class clazz) {
    return Observable.defer(() -> Observable.just(Realm.getDefaultInstance().where(clazz).findAll()));
}

如果您使用 Schedulers.io():

,则此答案适用

您是否考虑过关闭您在线程池中打开的 Realm 实例?

因为如果您不关闭 Realm(您确实没有),那么您将遇到 version retention 并且后台线程中的 Realm 实例将永远不会再次更新。

还可以考虑在使用 打开实例后刷新 Realm。

但还要确保关闭实例。事实上,考虑到您正在尝试为您的查询使用后台线程,您应该考虑使用 realm.copyFromRealm(realmResults) 以便您可以自由关闭实例。