Android上的领域:保持DB逻辑分离

时间:2017-02-27 12:07:17

标签: android realm

我曾经使用从Realm复制的非自动管理的模型对象。我切换到使用自动管理的Realm对象来处理我的新项目并遇到问题。

在我将DB逻辑分开之前,在DAO类中,现在,Realm代码遍布我的应用程序。

应该在每个线程,每个活动和片段上管理(关闭)Realm对象。但我最不喜欢的是:每个模型对象上的每个setter都需要在Realm事务中。现在我的代码中都有Realm!

在使用自动管理的Realm对象时,有没有人找到一种方法来保持数据库逻辑有些分离?

2 个答案:

答案 0 :(得分:0)

结论,使用Realm自动管理对象几个月后:

使用Realm的自动更新对象时,几乎不可能将数据库代码集中在数据访问对象(DAO)类等中。

  1. 每个模型对象上的每个setter都需要在Realm事务块中。如果您使用RetroLambda,则调用相对干净: realm.executeTransaction(r - > user.setFirstName(firstName)); 这些块将立即遍布您的项目。忘记在事务中包装setter方法(或构造函数调用)会使应用程序崩溃。相信我,在采用自动更新对象的前几周会发生很多事情。

  2. 无法跨线程共享自动更新的对象。 Realm实例也是如此。 所有线程,通常是活动和片段,都必须打开和关闭Realm实例。你会经常思考“我在哪个线上?”。如果您跨越模型对象或Realm实例的线程边界,您将崩溃您的应用程序。

  3. 此处有更多信息:https://medium.com/@ffvanderlaan/realm-auto-updated-objects-what-you-need-to-know-b2d769d12d76

    在这里:https://medium.com/@Zhuinden/how-to-use-realm-for-android-like-a-champ-and-how-to-tell-if-youre-doing-it-wrong-ac4f66b7f149#.gazrajqwt

答案 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