#android #kotlin #android-room
#Android #kotlin #android-room
Вопрос:
Я хочу иметь список учетных записей, сохраненных пользователем, но должна быть одна активная учетная запись, поэтому в базе данных Android Rooms должна быть одна учетная запись, помеченная как isActive = true.
Возможно ли это? Единственное, что я смог найти, это то, что Android Room сохраняет логическое значение как 1 (true) или 0 (false).
Ответ №1:
Другой возможностью было бы сохранить идентификатор или имя активной учетной записи в общих настройках. Таким образом, у вас будет только одно значение для проверки, чтобы узнать, какая учетная запись активна. И вы сэкономили бы много запросов на проверку того, какая учетная запись активна в вашей базе данных, или на обновление всех записей при смене активной учетной записи.
Что касается вашего вопроса. Я думаю, что важно учитывать, как вы собираетесь использовать это boolean
значение и когда и в каком контексте его следует запрашивать. Вам действительно следует спросить себя, выгодно ли вашему приложению, чтобы ваш класс сущностей имел это поле и «знал» о том, является ли его состояние активным или нет. При запросе Room сопоставляет данные SQLite с указанным вами классом объектов. Фактически, вы просто используете этот объект среды выполнения для выполнения чего-либо с данными. Лично я считаю, что с точки зрения логики имеет смысл, чтобы не сам объект знал, что он активен. Но что-то, что обрабатывает / управляет объектами вашей учетной записи. С этой точки зрения, вы спрашиваете: всякий раз, когда учетная запись объявляется активной, пусть все другие учетные записи (данные) знают, что они не активны. Вы упомянули, что эти учетные записи принадлежат пользователю. Тогда есть ли у этого пользователя своя собственная сущность? Если да, то не могли бы вы сохранить ссылку на учетную запись там?
Комментарии:
1. Это неплохая идея, и, вероятно, в данный момент я продвигаюсь вперед. Если нет прямого решения моего вопроса, я отмечу это как ответ.
Ответ №2:
Если у вас есть таблица users, лучше иметь столбец [active_account] в этой таблице и хранить там идентификатор текущей активной учетной записи. Если у вас есть только таблица accounts, вы можете использовать общие настройки для хранения идентификатора активной учетной записи (как указано в ответе cewaphi). Я думаю, что наличие флага isActive только для одной записи — действительно плохой дизайн.
Ответ №3:
Прежде чем задать строке значение true
, запросите базу данных для всех строк, которые имеют true
значение, и установите для них значение false
.
Комментарии:
1. Я думал об этом, но мне кажется, что это приведет к большому количеству (имхо ненужных) операций с БД. Я надеялся, что будет более простой способ.
2. Операции с базой данных очень эффективны. И, кроме того, это всего лишь пара несложных операций, и они выполняются только каждый раз, когда кто-то входит в систему (не очень часто).