在Realm中持久保存数据的模式?

时间:2016-02-10 01:08:03

标签: 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字段之外的所有字段。

问题是我现在需要设置&#34; user&#34;在util.save()方法中作为final的参数,这意味着我不能传递我需要保存的对象而不是一次。

有不同的处理方法吗?也许是不同的模式?或者我看到这一切都错了,应该回到SQLite?

1 个答案:

答案 0 :(得分:1)

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

也就是说,当你在代码库中传播更新行为时,save()方法的存在可能是潜在的代码味道。我建议改为查看Repository模式(https://stackoverflow.com/a/27923364/571237)。

Realm实际上正在开发一个示例,展示如何将Model-View-Presenter架构与Repository结合起来封装更新,这对于您在此处尝试执行的操作来说是一个很好的模式。您可以在此处查看代码:http://martinfowler.com/eaaCatalog/repository.html