2016-11-10 48 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內部獲得了結果。它確實有效。