Realm的Android适配器数据集实例化实践

时间:2016-11-10 07:49:39

标签: android realm

我想知道用Realm实例化适配器数据集的地方有用吗?我喜欢在适配器构造函数中获取任何适配器所需的所有数据,从而在那里实例化数据集,但我见过的几乎所有示例都是在创建适配器的活动中预先获取数据,然后将其作为参数传递给适配器。

使用SQLite这似乎更随意,但由于我正在使用Realm,每次我想访问数据库时都需要打开域连接并保持数据可用我需要保持连接打开。在活动中保持此连接打开似乎是不必要的,因为您可能需要在适配器中进行查询,因此无论如何都必须打开与适配器中的域的连接。

是否有更高的理由预先获取数据集,或者这只是一个偏好问题?

1 个答案:

答案 0 :(得分:0)

  

因为我正在使用Realm,所以每次我想访问数据库时都需要打开一个域连接

错误,您只需要为该给定线程提供1个打开实例即可访问数据库。

  

在活动中保持此连接打开“似乎没必要”,因为您可能需要在适配器中进行查询

在这种情况下,您可以将活动级Realm实例作为“作用域依赖项”,如果您愿意,可以通过上下文通过getSystemService()进行共享。

public class MyActivity extends Activity {
    Realm realm;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        realm = Realm.getDefaultInstance();
        //...
    }

    @Override
    public void onDestroy() {
        if(realm != null) {
           realm.close();
        }
        super.onDestroy();
    }
    ...

    @Override
    public Object getSystemService(String key) {
        if("REALM".equals(key)) {
            return realm;
        }
        return super.getSystemService(key);
    }
}

public class MyAdapter extends RecyclerView.Adapter<MyModelViewHolder> {
    private final Context context;
    Realm realm;

    RealmResults<MyModel> results;
    private final RealmChangeListener listener = new RealmChangeListener() {
        @Override
        public void onChange(Object element) {
            notifyDataSetChanged();
        }
    }

    public MyAdapter(Context context) {
        this.context = context;
        //noinspection ResourceType
        realm = (Realm)context.getSystemService("REALM");
        results = realm.where(MyModel.class).findAll();
        results.addChangeListener(listener);
    }

    ...
}
  因此,无论如何都必须在适配器内打开与领域的连接。

  

是否有更高的理由预先获取数据集,或者这只是一个偏好问题?

这是因为你的适配器,它只是描述如何显示数据集的元素,成为一个上帝,也决定了它必须显示的数据。

虽然公平,但外部管理数据集实际上更难; 必须持有对结果集的强引用。因此,当我真的不打扰单元可测试性时,我确实在Adapter本身内获得了结果。它确实有效。