Запись в базу данных SQLite из адаптера RecycleView - PullRequest
0 голосов
/ 03 июля 2019

У меня есть главное представление с одним RecyclerView (category_view) в нем и другим RecyclerView (task_view) в каждом ViewHolder в category_view.Таким образом, в каждой категории есть несколько задач.Данные заполняются из БД SQLite, у меня есть таблицы для категорий и задач.Также я указал Parcelable для классов данных Category и Task.

В настоящее время я передаю таблицу Cursor with Categories из MainActivity в CategoriesRecyclerAdapter + саму базу данных.Затем в CategoriesRecyclerAdapter я создаю другой курсор и передаю его TasksRecyclerAdapter.

Действия во вложенных задачах RecycleView (флажок) вызывают изменения в таблицах SQLite категорий и задач.

Мой вопрос - какпередавать данные между этими вложенными адаптерами, не передавая всю ссылку на БД или помощника по открытию БД в каждый 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);

}

1 Ответ

0 голосов
/ 03 июля 2019

Это вообще плохая идея.В идеале вы хотели бы передать прослушиватель вашему адаптеру и прослушать события в вашем фрагменте / активности.Исходя из их, вы должны использовать viewmodel / Presenter для связи со слоем базы данных, чтобы сделать обновления.В зависимости от результата операции, успеха / неудачи, вы можете обновить свой адаптер с помощью notifyItemChanged или, если хотите, выбрать решение, связанное с данными, и просто обновить модель данных вашего адаптера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...