169 похожих чатов

Кто шарит в Room? Есть ли способ как-то добавить в

реализацию интерфейсов @Dao, которая генерируется автоматически, свой код? Конкретно идея в том, чтобы кроме заполнения списка записей на основе select’а, нужно еще некоторые дополнительные поля списка заполнить не из базы.

35 ответов

13 просмотров

я бы писал классы поверх где есть поля не из базы. хз

Не понял смысла этого. Если нужно что-то еще заполнить, то делайте вызов метода, который это умеет(написанный вами в дао)

Дао отвечает только за работу с румом, ни более

Pavel-Vasilev Автор вопроса

Получается лишний проход, сначала сгенерированный код пробегает курсором все записи и заполняет список, потом мой метод опять пробегает все записи уже заполненного списка и дозаполняет его. Я из ++ пришел в мобильную разработку, мне кажется это неоптимально.

Посмотри в самом внизу есть direct cursos access, мб это то, что тебе нужно https://developer.android.com/training/data-storage/room/accessing-data

Ну тогда вам смотреть в сторону чистого OpenDBHelper(или как там его) без абстракций

Pavel-Vasilev Автор вопроса

да. я видел, там еще какая-то плашка страшная с предупреждением меня пугает.

А почему бы не выстроить код так, чтобы в один проход создавался элемент со всеми значениями?

Pavel-Vasilev Автор вопроса

Похоже на то. Просто везде хвалят и одобряют только Room, решил осваивать как рекомендуют. С другой стороны наверное реально такой функционал добавить в room , который генерил бы код с добавкой юзерской вставки. Теже TypeConverter существуют .

Room хвалят и все используют, чтобы код был попроще и видеть поменьше внутренностей работы с SQL. Под капотом там тот же OpenDBHelper, если не ошибаюсь.

+ поддержка корутин и Rx из коробки

Pavel-Vasilev Автор вопроса

Конкретно мне нужно считать из базы данных записи где есть поле даты+время, и пометить записи которые соответсвуют первому дню года, месяца и дня соответсвующей пометкой в отдельном поле.

Ну т.е. на основе уже существующих в БД данных? Можно либо вычислить остальное перед добавлением, либо лучше нормальный второй проход по базе с добавлением

Pavel-Vasilev Автор вопроса

Ну вот пример я добавляю в базу дату 10 июня, и она первая за июнь. ставлю пометку и сохраняю в б.д. потом мне вдруг приходится добавить запись за 9 июня, и значит она уже первая будет и значит надо снять пометку с предыдущей - звучит бредово. так же как бредово обновлять всю базу после каждого добавления изменения удаления.

А вы хотели, чтобы пометка с записи за 10 июня волшебным образом исчезла при добавлении записи за 9 июня?) Или 2 селекта делать не хочется?

Update db record, не? Сортировка ещё есть... Селекты всякие...

Pavel-Vasilev Автор вопроса

Не совсем. Изначально есть список на экране с записями считанными из массива, который считался через room из базы. юзер добавляет запись, делается новый запрос к базе, который заполняет массив и через уведомление от livdata перерисовывается список. Если не хранить пометки, то они легко на лету вычисляются проходом по отсортированному по дате массиву путем сравнения даты в текущей и предыдущей записи. Вот я и подумал что можно эти пометки вычислять в room на этапе загрузки записей, а не отдельным проходом по массиву.

Что такое пометки в вашем случае?

Pavel-Vasilev Автор вопроса

поле целого типа например или логическое. просто чтобы можно было бы пометить запись в списке особым образом, и вывести сумму за месяц, год и т.п. для юзера.

Если ваши пометки влияют лишь на порядок записей на экране, то лучше их вообще не иметь в базе для сортировки, а использовать дату или что-то еще.

Pavel-Vasilev Автор вопроса

Они влияют не на порядок, а на видимость заголовков для групп отображающих сумму за год, месяц, день в списке на базе recyclerview. Т.е. если запись (при обработке адаптере) имеет пометку первая за месяц, то я делаю видимыми заголовок за месяц.

Pavel-Vasilev Автор вопроса

Есть наверное другие способы отобразить заголовки групп, генерируя массивы в которых для заголовка отдельная запись, но мне хочется сократить лишние вычисления и использование памяти.

Тогда при добавлении новой записи сделайте поиск, который определит, является ли запись первой. Если да, то ставьте ей метку и, если у какой-то более поздней записи она уже есть, то убирайте ее отдельным запросом. Я очень сомневаюсь, что это как-то ухудшит производительность.

Pavel-Vasilev Автор вопроса

Это конечно сработает, но усложняет всю схему, с учетом того что записи могут собираться с нескольких мобил через базу в инете с последующей синхронизацией, то проще вычислять на лету, чем при добавлении.

Ну тут уже решение за вами. Потестируйте несколько сценариев и выберите тот, который лучше справляться будет.

Pavel-Vasilev Автор вопроса

Это да.. спасибо за советы.

Тогда есть риск, что в одной базе будет одно состояние данных, в другой - другое 🤔

Pavel-Vasilev Автор вопроса

После синхронизации у всех будет одно состояние до очередного добавления, врЕменное расхождение не критично, критична скорость работы интерфейса и затраты памяти устройства.

Скорее всего придется искать компромиссные решения. Производительность бд на мобилках не очень.

Pavel-Vasilev Автор вопроса

На моем редми4 про все летает на 100к записей

Было бы полезно на разных девайсах погонять.

625?

Pavel-Vasilev Автор вопроса

не понял, че за число?

snapdragon 625?

Pavel-Vasilev Автор вопроса

наверное, уже не помню. когда покупал писали что очень удачная моделька

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Карта сайта