房间多表同对象(多语言数据库)
Room multiple tables same Object (multi language database)
我正在开发一个 android 项目,该项目必须在本地数据库(房间)中存储一些数据。我必须提供的功能之一是将数据以不同的语言存储在本地数据库中,例如,如果我有食物信息,则该信息必须以英语、德语、法语等格式存储。
我的数据库的结构是这样的:
@Entity(tableName = "food")
public class Food{
}
@Entity(tableName = "food_fr")
public class FoodFr{
}
@Entity(tableName = "food_de")
public class FoodDe{
}
我的问题是如何让这三个不同的表(使用不同的语言)具有相同的列和 @Dao 对象 return 一个共同的(父)对象?
我不太确定这是否可行,但如果有人对此有解决方案,请提供帮助。
提前致谢:)
最好的解决方案是使用一个 table,而不是三个 table。使用列来区分三种语言(例如,具有 en
、fr
和 de
值的 language
列)。由于无论如何您都将重写大部分现有代码,因此从三个 table 切换到一个似乎不是主要障碍。
也就是说,要保持现有的三 table 结构,Food
、FoodFr
和 FoodDe
都从一个公共基础 [=26] 延伸=](例如,BaseFood
),您可以在其中定义 fields/columns.
对于查询,您需要让您的 DAO 处理所有四种情况(三种特定语言 tables,以及一种将所有三种结果组合起来的方法),例如:
@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;
}
您可以使用 @Embedded
注释合并不同的表。
https://developer.android.com/reference/android/arch/persistence/room/Embedded?authuser=4
并在 Dao 中 class 编写一个 sql 查询,将您的表与内部联接和 return 合并对象合并。
你可以看看我的示例应用程序。
https://github.com/volkansahin45/Moneycim
在 Model/Pojo 文件夹中有一个 Spending
class 并且在 Model/Dao 文件夹中有 SpendingDao
class
我正在开发一个 android 项目,该项目必须在本地数据库(房间)中存储一些数据。我必须提供的功能之一是将数据以不同的语言存储在本地数据库中,例如,如果我有食物信息,则该信息必须以英语、德语、法语等格式存储。
我的数据库的结构是这样的:
@Entity(tableName = "food")
public class Food{
}
@Entity(tableName = "food_fr")
public class FoodFr{
}
@Entity(tableName = "food_de")
public class FoodDe{
}
我的问题是如何让这三个不同的表(使用不同的语言)具有相同的列和 @Dao 对象 return 一个共同的(父)对象?
我不太确定这是否可行,但如果有人对此有解决方案,请提供帮助。
提前致谢:)
最好的解决方案是使用一个 table,而不是三个 table。使用列来区分三种语言(例如,具有 en
、fr
和 de
值的 language
列)。由于无论如何您都将重写大部分现有代码,因此从三个 table 切换到一个似乎不是主要障碍。
也就是说,要保持现有的三 table 结构,Food
、FoodFr
和 FoodDe
都从一个公共基础 [=26] 延伸=](例如,BaseFood
),您可以在其中定义 fields/columns.
对于查询,您需要让您的 DAO 处理所有四种情况(三种特定语言 tables,以及一种将所有三种结果组合起来的方法),例如:
@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;
}
您可以使用 @Embedded
注释合并不同的表。
https://developer.android.com/reference/android/arch/persistence/room/Embedded?authuser=4
并在 Dao 中 class 编写一个 sql 查询,将您的表与内部联接和 return 合并对象合并。
你可以看看我的示例应用程序。 https://github.com/volkansahin45/Moneycim
在 Model/Pojo 文件夹中有一个 Spending
class 并且在 Model/Dao 文件夹中有 SpendingDao
class