【问题标题】:Room multiple tables same Object (multi language database)房间多个表相同的对象(多语言数据库)
【发布时间】:2018-05-08 12:46:39
【问题描述】:

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

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

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

}

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

}

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

}

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

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

提前谢谢:)

【问题讨论】:

  • 为什么不用一张表,用语言栏区分三种语言?
  • @CommonsWare,因为我已经创建了我的数据库结构并基于该结构构建了大量代码。现在我正在寻找一种如何扩展不修改的方法
  • @CommonsWare 是对的,以后控制或修改所有表会更难。你应该修改你的代码

标签: android android-room


【解决方案1】:

最好的解决方案是使用一张桌子,而不是三张桌子。使用列来区分三种语言(例如,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;
}

【讨论】:

  • 非常感谢你推动我修改我当前的逻辑:) 现在我已经做到了,只是为表 Food (@Entity(primaryKeys{"id", "language_id" }))。一切都很好。再次感谢您
  • 好建议@CommonsWare
  • 试图实现相同但在 DaoImpl 类中使用事务构建失败。如果我尝试从事务中返回,则会出现此错误。
  • @Navdroid:您可以考虑提出一个单独的 Stack Overflow 问题,您可以在其中提供minimal reproducible example(源代码加上确切的构建错误消息)。
  • @CommonsWare - stackoverflow.com/questions/51852669/… 。请调查一下。谢谢
【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    • 2018-11-07
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多