簡體   English   中英

從RecycleView適配器寫入SQLite DB

[英]Writing to SQLite DB from RecycleView Adapter

我有一個主視圖,其中有一個RecyclerView(category_view),在category_view的每個ViewHolder中都有另一個RecyclerView(task_view)。 因此,每個類別中都有幾個任務。 數據是從SQLite DB填充的,我有用於類別和任務的表。 另外,我為Category和Task數據類都指定了Parcelable。

目前,我將帶有類別表的游標從MainActivity傳遞給CategoriesRecyclerAdapter +數據庫本身。 然后在CategoriesRecyclerAdapter中,制作另一個Cursor並將其傳遞給TasksRecyclerAdapter。

嵌套的RecycleView任務中的操作(復選框打勾)會導致類別和任務SQLite表中的更改。

我的問題是-如何在這些嵌套適配器之間傳遞數據而又不將整個數據庫鏈接或DB Open Helper傳遞給每個ViewHolder?

因此,當前我正在傳遞指向mDb = mDbOpenHelper.getReadableDatabase()的鏈接,以便每個適配器都可以訪問它。 現在我需要將數據寫入DB,因此我可以將2個鏈接或1個鏈接傳遞給DBOpenHelper,並在每個class.viewHolder中打開DB。 我不確定在每個ViewHolder中打開數據庫是否是最佳方案。 誰能建議其他解決方案或確認沒問題?

\\Main Activity: make a cursor and pass it to CategoriesRecyclerAdapter
...
private void getCategoriesFromDB() {
    mDb = mDbOpenHelper.getReadableDatabase();
    final Cursor categoryCursor = mDb.query(CategoryEntry.TABLE_NAME, 
    null, null, null, null, null, null);
    mCategoryRecyclerAdapter.changeCursor(categoryCursor, mDb);
}

\\CategoryRecyclerAdapter:
...
public void changeCursor(Cursor cursor, SQLiteDatabase db) {
    if (mCursor != null)
        mCursor.close();
    mCursor = cursor;
    populateColumnPositions();
    notifyDataSetChanged();
    mDb = db;
}

...
public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
    mCursor.moveToPosition(i);

    String selection = TaskEntry.COLUMN_CATEGORY_ID + " = ?";
    String selectionArgs[] = {Integer.toString(mId)};
    final Cursor taskCursor = mDb.query(TaskEntry.TABLE_NAME, null, 
          selection, selectionArgs, null, null, null);

    LinearLayoutManager tasksLayoutManager = new               LinearLayoutManager(viewHolder.mHolderView.getContext());

    TaskRecyclerAdapter taskRecyclerAdapter = new               TaskRecyclerAdapter(viewHolder.mHolderView.getContext(), null, mDb);

    RecyclerView recyclerTasks =                viewHolder.mHolderView.findViewById(R.id.list_tasks);
    recyclerTasks.setLayoutManager(tasksLayoutManager);
    recyclerTasks.setAdapter(taskRecyclerAdapter);

    taskRecyclerAdapter.changeCursor(taskCursor);

}

這通常是一個壞主意。 理想情況下,您希望將偵聽器傳遞給適配器,並偵聽片段/活動中的事件。 從他們那里,您應該使用viewmodel / presenter與數據庫層進行通信以進行更新。 根據操作的結果(成功/失敗),您可以使用notifyItemChanged更新適配器,或者如果冒險嘗試使用數據綁定解決方案,則只需更新適配器的數據模型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM