我的问题是如何组织代码。假设我有一个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?
答案 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