Страницы

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

понедельник, 24 февраля 2020 г.

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

#java #android #массивы #sqlite


Пишу приложение на Android, где у меня есть некоторый список (RecyclerView), в котором
есть возможность перетаскивания (drag & drop) строк в нужное для пользователя место
(выше/ниже относительно друг друга). Элементы списка (строки) могут быть разных классов
(под общим интерфейсом). Информация о созданных экземплярах, соответственно, хранится
в SQLite. 

На данный момент, сортировка списка всех элементов списка происходит по дате (при
создании списка сортируются в TreeSet'е и потом ArrayList'ом отдаются в адаптер).
Таким образом, при изменении порядка отображения элементов списка мне необходимо
зафиксировать этот порядок и сохранить его в БД (или может просто в JSON?).
Какие существуют, так сказать, лучшие практики сохранения и извлечения состояния
такого списка (да и вообще, подобных данных)?

Заранее благодарен!
    


Ответы

Ответ 1



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

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

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