Зал нескольких столов одного и того же объекта (многоязычная база данных) - PullRequest
0 голосов
/ 08 мая 2018

Я работаю над проектом Android, где нужно хранить некоторые данные в локальной БД (Комната). Одна из функций, которую я должен предоставить, - хранить данные в локальной БД на разных языках, например, если у меня есть информация для еды, эта информация должна храниться на английском, немецком, французском и т. Д.

Структура моей БД выглядит примерно так:

@Entity(tableName = "food")
public class Food{

}

@Entity(tableName = "food_fr")
public class FoodFr{

}

@Entity(tableName = "food_de")
public class FoodDe{

}

У меня вопрос, как я могу иметь эти три разные таблицы (на разных языках) с одинаковыми столбцами, и объект @Dao возвращает один общий (родительский) объект для всех из них?

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

Заранее спасибо :)

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Вы можете объединить разные таблицы с аннотацией @Embedded. https://developer.android.com/reference/android/arch/persistence/room/Embedded?authuser=4

А в классе Dao напишите sql-запрос, который объединит ваши таблицы с внутренним объединением и вернет этот объединенный объект.

Вы можете посмотреть мой пример приложения. https://github.com/volkansahin45/Moneycim

В папке Model / Pojo есть класс Spending, а в папке Model / Dao - SpendingDao class

0 голосов
/ 08 мая 2018

Лучшее решение - иметь одну таблицу, а не три таблицы. Используйте столбец, чтобы различать три языка (например, столбец language со значениями en, fr и de). Так как вы все равно будете переписывать большую часть существующего кода, переход с трех таблиц на одну не будет серьезным препятствием.

При этом для сохранения существующей структуры из трех таблиц Food, FoodFr и FoodDe все расширяются из общего базового класса (например, BaseFood), где вы определяете свои поля / столбцы.

Для запросов вам потребуется, чтобы ваш DAO обрабатывал все четыре случая (три таблицы конкретных языков и метод объединения результатов для всех трех), например:

@Query("SELECT * FROM Food")
List<Food> getAllFood();

@Query("SELECT * FROM FoodFr")
List<FoodFr> getAllFrenchFood();

@Query("SELECT * FROM FoodDe")
List<FoodDe> getAllGermanFood();

@Transaction
List<BaseFood> getAllFoodAcrossAllThreeLanguages() {
  ArrayList<BaseFood> result=new ArrayList<>();

  result.addAll(getAllFood());
  result.addAll(getAllFrenchFood());
  result.addAll(getAllGermanFood());

  return result;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...