使用Android Room持久化库将一个对象插入另一个对象中

9

目录

@Entity(tableName = "directory")
class Directory(@PrimaryKey(autoGenerate = false) var id: Int? = null,
                @ColumnInfo(name = DIR_NAME) var dirName: String? = null,
                @Ignore var dirImages: List<Images>? = null

) : Serializable {
    companion object {
        const val DIR_NAME = "dirName"
        const val DIR_IMAGES = "dirImages"
    }
}

图像模型

@Entity(foreignKeys = arrayOf(ForeignKey(entity = Directory::class,
        parentColumns = arrayOf("id"),
        childColumns = arrayOf("id"),
        onDelete = ForeignKey.CASCADE)))

data class Images(
        @PrimaryKey(autoGenerate = false) val id: Int? = null,
        @ColumnInfo(name = "image") val images: String
) {

}

Directory Dao

@Dao
interface DirectoryDao {

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insertAll(directory: ArrayList<Directory>?)

}

如何在目录中插入图像列表? 是否应该为图像创建单独的Dao?

我能提供的最接近的建议是使用 @Transaction 注解。 - Enzokie
1个回答

8
为什么不将图像列表简单化为字符串列表?(如果您想坚持使用图像,则可以在Kotlin中使用typealias)
根据您需要如何访问您的“Image”对象,您有两个选项。 您是否只需要从“Directory”对象获取“Images”列表,还是需要对DB中的“images”进行一些查询? (例如计数、findBy等)
第一种选择,如果您只想在Directory对象中获取图像列表(可能是最适合您的情况):
@Entity(tableName = "directory")
class Directory(@PrimaryKey(autoGenerate = false) var id: Int,
                @ColumnInfo(name = DIR_NAME) var dirName: String,
                @ColumnInfo(name = "images")
                @TypeConverters(ImagesConverters::class)
                 var dirImages: List<Images>)

ImagesConverters.kt是哪里:

public class ImagesConverters {

    /**
     * Convert a a list of Images to a Json
     */
    @TypeConverter
    fun fromImagesJson(stat: List<Images>): String {
        return Gson().toJson(stat)
    }

    /**
     * Convert a json to a list of Images
     */
    @TypeConverter
    fun toImagesList(jsonImages: String): List<Images> {
        val notesType = object : TypeToken<List<Images>>() {}.type
        return Gson().fromJson<List<Images>>(jsonImages, notesType)
    }
}

不要忘记在gradle文件中添加gson:

不要忘记在gradle文件中添加gson:

implementation 'com.google.code.gson:gson:2.8.4'

在您的表格“Directory”中,它将直接以json格式储存在列“images”中。 第二个选项是,如果您只想为图像使用不同的表格并对其执行查询。
您需要使用一对多的关系,并拥有3个对象:
// directory.kt
@Entity(tableName = "directory")
class Directory(@PrimaryKey(autoGenerate = false) var id: Int,
                @ColumnInfo(name = DIR_NAME) var dirName: String)


// image.kt
@Entity(tableName = "images")
class Image(@PrimaryKey(autoGenerate = false) var id: Int,
            @ColumnInfo(name ="images") var image: String,
            @ColumnInfo(name ="directoryId") var directoryId: Int)

// directoryWithImages.kt
public class DirectoryWithImages {
   @Embedded
   public Directory directory;

   @Relation(parentColumn = "id", entityColumn = "directoryId", entity = Image.class)
   public List<Image> images;
}

最后是你的数据访问对象(dao):
@Dao
public interface LoadDirectoryWithImagesDao {
    @Query("SELECT * FROM directory")
    public List<DirectoryWithImages> loadDirectoriesWithImages();
}

希望这能帮到你!

6
除了选项1外,还应在AppDatabase上声明类型转换器 -> @TypeConverters(ImagesConverters::class)。 - Renz Manacmol
是否定义了DIR_NAME - petyr
2
选项2:如何将这些对象插入到数据库中? - Simon
@Simon 这将导致两个单独的插入。首先,您要插入目录,然后是图像,即:@Insert(onConflict = OnConflictStrategy.REPLACE) fun insertDirectory(directory: Directory)@Insert(onConflict = OnConflictStrategy.REPLACE) fun insertImages(images: List<Image>) - Simon Harvan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接