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):
- Попытайтесь получить сущность, которую вы хотите изменить из БД (возможно, она уже находится в кеше, поэтому это может быть не реальная операция с базой данных)
- Если у вас нет такой сущности: создайте ее
- Изменить сущность в соответствии с вашими потребностями
- Вставьте или обновите его в базе данных (в greendao вы бы использовали insertOrReplace)