java - Realm 中持久数据的模式?

标签 java android sqlite realm

我的问题是如何组织代码。假设我有一个 User 类

public class User extends RealmObject {
    @PrimaryKey
    private String id;
    @Required
    private String name;

    public User() { // per requirement of no args constructor
        id = UUID.randomUUID().toString();
    }

    // Assume getter & setter below...
}

并且需要一个 Util 类来以异步方式处理保存,因为 RealmObjects 不能有除 getter/setter 之外的方法。

public class Util {
    public static void save(User user, Realm realm) {
        RealmAsyncTask transaction = realm.executeTransaction(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
                realm.copyToRealm(user);  // <====== Argument needs to be declared final in parent method's argument!
            }
        }, null);
    }
}

目的是将 save() 放在 Util 类中,以防止在整个代码库中传播类似的保存代码,这样每次我想要保存时,我都会这样调用它:

User u = new User();
u.setName("Uncle Sam");
Util.save(u, Realm.getDefaultInstance());

不确定这是否会影响性能,但我只是要保存所有字段,覆盖除唯一 id 字段之外的所有字段。

问题是我现在需要在 Util.save() 方法中将“user”参数设置为最终参数,这意味着我只能传入需要保存一次的对象。

有什么不同的方法来处理这个问题吗?也许有不同的模式?或者我认为这一切都是错误的,应该回到 SQLite?

最佳答案

为什么设置 public static void save(final User user, Realmrealm) 会出现问题?这只是意味着您无法将 user 变量重新分配给其他变量。

也就是说,当您将更新行为传播到整个代码库时,save() 方法的存在可能会成为潜在的代码异味。我建议改为研究诸如存储库模式( http://martinfowler.com/eaaCatalog/repository.html )之类的东西。

Realm 实际上正在研究一个示例,展示如何将模型- View -呈现器架构与存储库结合起来以封装更新,这对于您在这里尝试执行的操作来说是一个很好的模式。您可以在这里查看它的代码:https://github.com/realm/realm-java/pull/1960

关于java - Realm 中持久数据的模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35305164/

相关文章:

java - 使用 Struts2 生成报告时出现 ClassCastException

android - 如何在 Google Play 中分发 ARCH 的 apk?

对话框中 FindViewById 处的 Android java.lang.NullPointerException

android - 当自动增量列超过 SQLite 中的最大值时会发生什么

android - 我怎样才能只从安卓电话簿中获取所有手机号码?

Java:JOptionPane 单选按钮

java - 如何使用 SPRING REST 将 JSON 请求映射到字符串

java - 为什么这件事做不到呢?

android - 从 Firebase 监听器发出状态 - Kotlin Flow

iphone - 从 SQLite DB 获取 BOOL 时出现问题