Страницы

Поиск по вопросам

четверг, 2 мая 2019 г.

Какие существуют способы сохранения состояния списка (ArrayList) в БД?

Пишу приложение на Android, где у меня есть некоторый список (RecyclerView), в котором есть возможность перетаскивания (drag & drop) строк в нужное для пользователя место (выше/ниже относительно друг друга). Элементы списка (строки) могут быть разных классов (под общим интерфейсом). Информация о созданных экземплярах, соответственно, хранится в SQLite.
На данный момент, сортировка списка всех элементов списка происходит по дате (при создании списка сортируются в TreeSet'е и потом ArrayList'ом отдаются в адаптер). Таким образом, при изменении порядка отображения элементов списка мне необходимо зафиксировать этот порядок и сохранить его в БД (или может просто в JSON?). Какие существуют, так сказать, лучшие практики сохранения и извлечения состояния такого списка (да и вообще, подобных данных)?
Заранее благодарен!


Ответ

Вам не нужно перегонять данные из БД в какие то локальные массивы. Работайте напрямую с базой данных, она имеет на порядок более мощный, чем "жалкие" методы коллекций, язык SQL, специально предназначеный для обработки, сортировки и тп. данных, содержащихся в базе, а так же выполняет эту обработку на порядки же быстрее, чем Java.
Сам подход, который вы пытаетесь применить выглядит несколько нелогично. Зачем хранить данные в БД, но обрабатывать их какими то примитивными и медленными способами, при этом еще тратя время и на промежуточное извлечение из БД в массив, потом еще в другой массив.
По вопросу - вам не нужно сохранять какой то измененный порядок сортировки, переписывая БД. Вам нужен правильный запрос в БД, который вернет данные (курсор), отсортированные в нужном порядке, именно так это делается. Затем этот курсор, в котором уже все отсортированно как надо через SQL-запрос, вы передаете непосредственно в адаптер списка и заполняете сам список данными из курсора, а не из каких то ArrayList-ов.
UPD Если нужно сохранить произвольную пользовательскую сортировку, то опять же нужно модифицировать не следование записей в базе, а добавить к каждой записи еще один столбец для хранения порядка сортировки. При перетаскивании записывать в этот столбец позицию в списке элемента, в которую его перетащили. При выборке делать запрос с сортировкой по этому столбцу.
То есть, примерная схема - делаем выборку из БД с сортировкой по времени, заполняем этой выборкой список, при перетаскивании пишем в БД позицию, в которую перетащили (в столбец пользовательской сортировки для записи, которую перетащили), обновляем адаптер через выборку с сортировкой по столбцу с этими позициями - все просто и прозрачно
Это будет правильная архитектура работы с БД, а то, что пытаетесь сделать вы, какой то любительский костыль, простите за резкость, надеюсь это поможет понять вам всю глубину заблуждений :)
Так же смотрите этот ответ по сортировке в БД

Комментариев нет:

Отправить комментарий