【问题标题】:Pattern for persisting data in Realm?在 Realm 中持久化数据的模式?
【发布时间】:2016-02-10 01:08:03
【问题描述】:

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

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”参数设置为 final,这意味着我不能传入需要保存的对象,只能保存一次。

是否有不同的处理方式?也许是不同的模式?还是我认为这一切都错了,应该回到 SQLite?

【问题讨论】:

    标签: java android sqlite realm


    【解决方案1】:

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

    也就是说,save() 方法的存在可能是一种潜在的代码异味,因为您随后会将更新行为传播到代码库中。我建议改为研究类似存储库模式 (http://martinfowler.com/eaaCatalog/repository.html) 的内容。

    Realm 实际上正在研究一个示例,展示如何将 Model-View-Presenter 架构与 Repository 相结合来封装更新,这对于您在这里尝试做的事情来说是一个很好的模式。你可以在这里看到它的代码:https://github.com/realm/realm-java/pull/1960

    【讨论】:

    • 我认为第一个错误是在public static void save(final User user, Realm realm) 中,我将其定为最终版本,这意味着它仅适用于一个用户,这显然不是真的。我没有听说过存储库模式,据我了解,它本质上是 ORM 和任何需要数据(如视图)之间的抽象?但是,由于 Java 处理闭包的方式,使用匿名类的方式总是需要 final 关键字。如何才能传递要保存的用户?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多