房间多个表相同对象(多语言数据库)

时间:2018-05-08 12:46:39

标签: android android-room

我正在开发一个Android项目,必须在本地数据库(Room)中存储一些数据。我必须提供的功能之一是以不同语言将数据存储在本地数据库中,例如,如果我有食物信息,则此信息必须以英语,德语,法语等存储。

我的数据库的结构是这样的:

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

}

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

}

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

}

我的问题是如何在这三个不同的表(不同语言)中使用相同的列,并且@Dao对象为所有这些表返回一个公共(父)对象?

我不确定这是否可行,但如果某人有解决方案,请提供帮助。

提前致谢:)

2 个答案:

答案 0 :(得分:9)

最好的解决方案是拥有一个表,而不是三个表。使用列来区分三种语言(例如,language列包含enfrde值。因为无论如何你将重写大部分现有代码,从三个表转换为一个表似乎不是一个主要障碍。

话虽如此,为了保留现有的三表结构,FoodFoodFrFoodDe都来自公共基类(例如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;
}

答案 1 :(得分:2)

您可以使用@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