[英]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.