Обновление столбца элемента в таблице, связанной с полем в другой таблице (случай с двумя таблицами) android база данных комнаты - PullRequest
0 голосов
/ 08 мая 2020

Простое продуктовое приложение на Android. Все локально с использованием Room DataBase, с использованием модели MVVM и Kotlin. У меня есть DataBase, Repository и ViewModel. Я практикуюсь с этим приложением, и мне не нравится DataBase в настоящее время.

У меня две таблицы:

  • ShoppingItems (элементы, которые я хочу)
  • ReferenceItems (Товары, которые я обычно покупаю и знаю цену)

В таблице ReferenceItems у меня есть 3 столбца:

  • Id
  • Имя (уникальное)
  • Цена за единицу

В таблице ShoppingItems у меня есть следующие столбцы:

  • Id (PrimaryKey)
  • Имя
  • Сумма
  • Идентификатор ссылки (внешний ключ) (если идентификатор находится в таблице ссылок, иначе я получил идентификатор из справочного элемента по умолчанию, который я предварительно внес в таблицу)
  • Цена за единицу (= соответствующая эталонная цена за единицу)

Теперь все работает отлично, используя LiveData<> для чтения такой информации, как количество или общая цена.

Мой вопрос: могу ли я использовать только идентификатор ReferenceItems в таблице ShoppingItems, чтобы получить цену за единицу.

Фактически, пользователь сможет редактировать цену за единицу в ReferenceItems таблица при необходимости. Я хочу, чтобы приложение обновляло только ОДНО поле в таблице ReferenceItems. В реальной ситуации мне придется обновить цену в ReferenceItems таблице И ShoppingItems таблице.

1 Ответ

1 голос
/ 08 мая 2020

Могу ли я использовать только идентификатор ReferenceItems в таблице ShoppingItems, чтобы получить цену за единицу

Да, вы можете.

Сценарий 1 (без вспомогательных class) .

Измените ваш запрос в dao на что-то вроде этого:

@Query("select shoppingItems.*, referenceItems.unitPrice from shoppingItems left join referenceItems on shoppingItems.referenceId=referenceItems.id")
LiveData<List<ShoppingItems>> getShoppingItems()

Но для этого вам нужно сохранить поле "unitPrice" в вашем "shoppingItems" class (конечно, вы можете оставить его пустым при вставке данных). Вы можете поиграть с аннотацией @Ignore, пытаясь не сохранять это поле в db, но я не могу гарантировать, что запрос вернет цену в этом случае.

Сценарий 2 (с вспомогательным классом) .

Необходимые шаги:

  1. Добавить новый вспомогательный класс ShoppingItemsWithPrice (этот класс не должен сохраняться в БД, поэтому у него нет @Entity).

    public class ShoppingItemsWithPrice { @Embedded public ShoppingItems shoppingItems; @Relation(parentColumn = "referenceId", entityColumn = "id") public ReferenceItems referenceItems; }

  2. И ваш запрос DAO:

    @Query("select * from shoppingItems") LiveData<List<ShoppingItemsWithPrice>> getShoppingItemsWithPrice()

В результате запрос возвращает вам объект со всем, что есть в обеих таблицах. Вы можете оптимизировать это (чтобы получить только одно необходимое поле) согласно этой статье

...