2016-11-10 53 views
1

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

使用SQLite这看起来更加武断,但由于我使用领域我需要打开领域连接每次我想要访问数据库并保持数据可用我需要保持连接打开。保持连接在活动中打开似乎没有必要,因为您可能需要在适配器中进行查询,因此必须在适配器内打开连接到领域的连接。

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

+0

这只是一个偏好问题,但IMO混合提取数据并显示它们似乎将它们耦合得比我在大多数情况下更喜欢的高。 –

回答

0

,因为我使用的领域,我需要我要访问数据库

错误每次打开一个境界连接,你只需要为给定的线程1个打开实例,以访问数据库。

保持这种连接在活动开放“似乎没有必要”,因为你可能需要进行查询的适配器

在这种情况下,你可以有活性级领域实例为“范围依赖“,你可以通过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内部获得了结果。它确实有效。