我曾经使用从Realm复制的非自动管理的模型对象。我切换到使用自动管理的Realm对象来处理我的新项目并遇到问题。
在我将DB逻辑分开之前,在DAO类中,现在,Realm代码遍布我的应用程序。
应该在每个线程,每个活动和片段上管理(关闭)Realm对象。但我最不喜欢的是:每个模型对象上的每个setter都需要在Realm事务中。现在我的代码中都有Realm!
在使用自动管理的Realm对象时,有没有人找到一种方法来保持数据库逻辑有些分离?
答案 0 :(得分:0)
结论,使用Realm自动管理对象几个月后:
使用Realm的自动更新对象时,几乎不可能将数据库代码集中在数据访问对象(DAO)类等中。
每个模型对象上的每个setter都需要在Realm事务块中。如果您使用RetroLambda,则调用相对干净: realm.executeTransaction(r - > user.setFirstName(firstName)); 这些块将立即遍布您的项目。忘记在事务中包装setter方法(或构造函数调用)会使应用程序崩溃。相信我,在采用自动更新对象的前几周会发生很多事情。
无法跨线程共享自动更新的对象。 Realm实例也是如此。 所有线程,通常是活动和片段,都必须打开和关闭Realm实例。你会经常思考“我在哪个线上?”。如果您跨越模型对象或Realm实例的线程边界,您将崩溃您的应用程序。
此处有更多信息:https://medium.com/@ffvanderlaan/realm-auto-updated-objects-what-you-need-to-know-b2d769d12d76
答案 1 :(得分:-1)
我所做的是创建了一个RealmController类,它处理我的所有Realm事务,并从API中获取新数据。实现的框架是从我现在找不到的另一个SO帖子中借来的,但你应该可以通过搜索RealmController在Google上找到它。
public class RealmController {
private static RealmController instance;
private final Realm realm;
private ServiceInterface restInterface;
private final String TAG = "RealmController";
private static boolean browseFetchAllowed = true;
private RealmConfiguration config = new RealmConfiguration.Builder()
.name("myRealm")
.schemaVersion(0)
.deleteRealmIfMigrationNeeded()
.build();
public RealmController(Application application) {
restInterface = ServiceGenerator.createService(ServiceInterface.class);
realm = Realm.getInstance(config);
}
public void setAuthentication(String token, String uid) {
this.restInterface = ServiceGenerator.createService(ServiceInterface.class, token, uid);
}
public static RealmController with(Fragment fragment) {
if (instance == null) {
instance = new RealmController(fragment.getActivity().getApplication());
}
return instance;
}
public static RealmController with(Activity activity) {
if (instance == null) {
instance = new RealmController(activity.getApplication());
}
return instance;
}
public static RealmController with(Application application) {
if (instance == null) {
instance = new RealmController(application);
}
return instance;
}
public RealmController getInstance() {
return instance;
}
public ServiceInterface getRestInterface() {
return restInterface;
}
public Realm getRealm() {
return realm;
}
public RealmResults<MyRealmObject> getStuff() {
return realm.where(MyRealObject.class).findAll();
}
public void setStuff(RealmList<MyRealmObject> stuff) {
realm.beginTransaction();
realm.copyToRealmOrUpdate(stuff);
realm.commitTransaction();
}
public void getStuffFromServer() {
restInterface.getStuff().enqueue(new Callback<RealmList<MyRealmObject>>() {
@Override
public void onResponse(Call<RealmList<MyRealmObject>> call, Response<RealmList<MyRealmObject>> response) {
if (response.isSuccessful()) {
realm.beginTransaction();
realm.copyToRealmOrUpdate(response.body);
realm.commitTransaction();
}
}
@Override
public void onFailure(Call<RealmList<RealmAd>> call, Throwable t) {
t.printStackTrace();
}
});
}
}
在文件底部我添加了一些示例,但使用非常简单:
RealmResults<MyRealmObject> results = RealmController.with(this).getStuff();
就自动管理对象而言,我一直在使用的是RealmResults,它总是自动管理(即使您要查询单个对象)。然后只需在查询结果中添加一个更改侦听器即可。另外,如果您想在recyclerviews中拥有自动更新数据,我建议RealmRecyclerView。