如何在 android 房间中嵌入实体列表?
How to Embedd List of Entites in android room?
我想在另一个实体中嵌入某个实体的列表 class
喜欢:
@Entity
public class FirstEntity() {}
@Entity
public class SecondEntity() {
@Embedded
List<FirstEntity> firstEntities ;
}
任何人都可以通过示例给我一个解决方案。
谢谢
您需要使用转换器。我通过 GSON 库将对象列表转换为 JSON 字符串(因此在 gradle 文件中添加依赖项):
implementation 'com.google.code.gson:gson:2.8.2'
首先用 @TypeConverter
注释创建一个 Converter 来转换你的列表(这里是我的示例,带有一个 class 命名输出):
class OutputConverter {
@TypeConverter
fun fromOutputList(outputs: List<Output>?): String? {
if (outputs == null) {
return null
}
val gson = Gson()
val type = object : TypeToken<List<Output>>() {}.type
return gson.toJson(outputs, type)
}
@TypeConverter
fun toOutputList(outputString: String?): List<Output>? {
if (outputString == null) {
return null
}
val gson = Gson()
val type = object : TypeToken<List<Output>>() {}.type
return gson.fromJson(outputString, type)
}
}
然后您需要在数据库中声明转换器 class :
@Database(entities = [(YourParentClass::class)], version = 1)
@TypeConverters(OutputConverter::class)
abstract class YourDataBase : RoomDatabase() {
abstract fun yourDao(): YourDao
}
您应该使用联接来解决您的问题,而不是增加数据冗余。如果你想学习goto https://www.guru99.com/sqlite-join.html#1。我认为这种方式会更好。
我找到了解决办法。我必须像这样创建一个新的 class
public class Wrapper {
@Embedded
public FirstEntity firstEntity;
@Relation (parentColumn = columnOfFirstEntity, entityColumn = columnOfSecondEntity)
public List<SecondEntity> secontEntities;
//Insert getters and setters
}
即使其中只有一个项目,您也必须将关系实体用作列表,如果其中只有一个项目,只需获取并设置列表中的第一个元素。
Dao 会像这样
@Dao
public interface WrapperDao {
@Query( "SELECT * FROM FirstEntity" )
public List<Wrapper> getAllWrappers();
}
我想在另一个实体中嵌入某个实体的列表 class 喜欢:
@Entity
public class FirstEntity() {}
@Entity
public class SecondEntity() {
@Embedded
List<FirstEntity> firstEntities ;
}
任何人都可以通过示例给我一个解决方案。 谢谢
您需要使用转换器。我通过 GSON 库将对象列表转换为 JSON 字符串(因此在 gradle 文件中添加依赖项):
implementation 'com.google.code.gson:gson:2.8.2'
首先用 @TypeConverter
注释创建一个 Converter 来转换你的列表(这里是我的示例,带有一个 class 命名输出):
class OutputConverter {
@TypeConverter
fun fromOutputList(outputs: List<Output>?): String? {
if (outputs == null) {
return null
}
val gson = Gson()
val type = object : TypeToken<List<Output>>() {}.type
return gson.toJson(outputs, type)
}
@TypeConverter
fun toOutputList(outputString: String?): List<Output>? {
if (outputString == null) {
return null
}
val gson = Gson()
val type = object : TypeToken<List<Output>>() {}.type
return gson.fromJson(outputString, type)
}
}
然后您需要在数据库中声明转换器 class :
@Database(entities = [(YourParentClass::class)], version = 1)
@TypeConverters(OutputConverter::class)
abstract class YourDataBase : RoomDatabase() {
abstract fun yourDao(): YourDao
}
您应该使用联接来解决您的问题,而不是增加数据冗余。如果你想学习goto https://www.guru99.com/sqlite-join.html#1。我认为这种方式会更好。
我找到了解决办法。我必须像这样创建一个新的 class
public class Wrapper {
@Embedded
public FirstEntity firstEntity;
@Relation (parentColumn = columnOfFirstEntity, entityColumn = columnOfSecondEntity)
public List<SecondEntity> secontEntities;
//Insert getters and setters
}
即使其中只有一个项目,您也必须将关系实体用作列表,如果其中只有一个项目,只需获取并设置列表中的第一个元素。
Dao 会像这样
@Dao
public interface WrapperDao {
@Query( "SELECT * FROM FirstEntity" )
public List<Wrapper> getAllWrappers();
}