如何在 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();

}