gpt4 book ai didi

java - 从 RecyclerView 适配器写入 SQLite DB

转载 作者:行者123 更新时间:2023-12-02 03:35:58 24 4
gpt4 key购买 nike

我有一个主视图,其中有一个RecyclerView(category_view),在category_view的每个ViewHolder中还有另一个RecyclerView(task_view)。所以每个类别都有几个任务。数据从 SQLite DB 填充,我有类别和任务表。我还为类别和任务数据类指定了 Parcelable。

目前,我将带有类别表的游标从 MainActivity 传递到 CategoryRecyclerAdapter + 数据库本身。然后在 CategoryRecyclerAdapter 中创建另一个 Cursor 并将其传递给 TasksRecyclerAdapter。

嵌套 RecycleView 任务中的操作(复选框勾选)会导致类别和任务 SQLite 表中发生更改。

我的问题是 - 如何在这些嵌套适配器之间传递数据,而不将整个数据库链接或 DB Open Helper 传递给每个 ViewHolder?

所以目前我正在传递一个指向 mDb = mDbOpenHelper.getReadableDatabase() 的链接,以便每个适配器都可以访问它。现在我需要将数据写入数据库,因此我可以将2个链接或1个链接传递给DBOpenHelper并在每个class.viewHolder中打开数据库。我不确定在每个 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);

}

最佳答案

这通常是一个坏主意。理想情况下,您希望将监听器传递给适配器,并监听 fragment/Activity 中的事件。从他们看来,您应该使用 View 模型/演示者与数据库层进行通信以进行更新。根据操作结果(成功/失败),您可以使用 notificationItemChanged 更新适配器,或者如果喜欢冒险,可以选择 databiniding 解决方案并仅更新适配器的数据模型。

关于java - 从 RecyclerView 适配器写入 SQLite DB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56861006/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com