从RecycleView适配器写入SQLite DB

时间:2019-07-02 23:03:13

标签: java android sqlite

我有一个主视图,其中有一个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);

}

1 个答案:

答案 0 :(得分:0)

这通常是个坏主意。理想情况下,您希望将侦听器传递给适配器,并侦听片段/活动中的事件。从他们那里,您应该使用viewmodel / presenter与数据库层进行通信以进行更新。根据操作的结果(成功/失败),您可以使用notifyItemChanged更新适配器,或者如果冒险尝试使用数据绑定解决方案,则只需更新适配器的数据模型。