Как эффективно сохранять и извлекать позицию элемента во внутренней базе данных?

#flutter #backend #sqflite

#flutter #серверная #sqflite

Вопрос:

Я внедряю простое приложение todo в flutter и sqflite как DB (sql). Я реализовал ListView, используя ReorderableListView (т.Е. Элементы можно перетаскивать по вертикали), я хочу сохранять позицию в БД всякий раз, когда происходит перетаскивание. Я использовал его, изменяя каждый элемент в БД после определенного индекса, но это неэффективно, потому что, если есть тысячи задач, то обновление позиций большинства задач в БД неэффективно, а также при использовании любого вида серверной части (например, firebase). Есть ли способ эффективно реализовать это? Спасибо.

Мой код:

 Future<void> updateMultiple(List<Todo> rows, int start) async {
Database db = await instance.database;
final batch = db.batch();
for (int i = start; i < rows.length; i  ) {
  final td = rows[i];
  td.setIndex(i);
  batch.update(table, td.toMap(),
      where: '_id = ?', whereArgs: [rows[i].id]);
}
await batch.commit(noResult: true);
}
 

Примечание: Вышеуказанный метод вызывается каждый раз, когда происходит перетаскивание.

введите описание изображения здесь

Ответ №1:

Непрерывный вызов базы данных — не лучший способ выполнения этих действий, поскольку вы обращаетесь к диску. Ситуация становится еще хуже, если вы используете удаленную базу данных. Чтобы поддерживать достаточно быстрое обновление, лучшим вариантом является обновление данных с использованием локального состояния, а затем обновление базы данных только в определенных ситуациях (удаление виджета, изменение жизненного цикла приложения и т. Д.)