Android Greendao обновить только определенные поля в сущности

Я долго искал решение моей проблемы, но безуспешно.

У меня есть приложение, в котором я получаю информацию для конкретной сущности в моей базе данных из разных служб, поэтому я использую методы insertOrReplace greenDAO, поэтому, когда сущность уже существует в моей БД, она обновляется, а не воссоздается.

Все идет нормально.

Проблема в том, скажем, например, что моя сущность называется User, с полями id, title и displayName.

Таким образом, при первом вызове я получаю объект JSON, содержащий пользователя только с его полями id и title, поэтому я вставляю его в БД и, естественно, displayName вставляется как NULL.

После этого из другого сервиса я получаю другой JSON, содержащий того же пользователя (то же поле id), но он также поставляется с displayName, но вообще не включает информацию о заголовке.

Поэтому всякий раз, когда я запускаю insertOrReplace для объекта DAO, автоматически сгенерированного greenDAO, пользователь обновляется, но, поскольку информация о заголовке отсутствовала, при обновлении поле заголовка сбрасывается в NULL, поэтому я теряю данные.

К сожалению, я не могу изменить данные, возвращаемые службами, и не смог решить эту проблему. Мне трудно поверить, что нет простого способа указать объекту DAO обновить только определенные поля и не все из них.

Я просматривал код, сгенерированный greenDAO, и в сгенерированных объектах dao есть метод bindValues, который вызывается до выполнения запроса, и, очевидно, он отфильтровывает свойства NULL из объекта, но в любом случае он обновляется с помощью NULL. значение.

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

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

Благодарю.

1 ответ

Решение

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

Обычно вы используете этот подход (вставка или обновление), если вы используете ORM-Framework (например, greendao):

  1. Попытайтесь получить сущность, которую вы хотите изменить из БД (возможно, она уже находится в кеше, поэтому это может быть не реальная операция с базой данных)
  2. Если у вас нет такой сущности: создайте ее
  3. Изменить сущность в соответствии с вашими потребностями
  4. Вставьте или обновите его в базе данных (в greendao вы бы использовали insertOrReplace)
Другие вопросы по тегам