gpt4 book ai didi

android - 使用 android room 持久性库在对象内插入对象

转载 作者:IT老高 更新时间:2023-10-28 13:42:35 26 4
gpt4 key购买 nike

目录

@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
) {

}

目录道

@Dao
interface DirectoryDao {

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

}

如何在目录中插入图像列表?我应该为图像创建一个单独的 Dao 吗?

最佳答案

为什么不让你的图像列表成为一个简单的字符串列表呢? (如果你想坚持形象,你可以在kotlin中使用typealias)

您有 2 个选项,具体取决于您访问 图像 对象的方式。您可以只从 Directory 对象中获取图像列表,还是需要对数据库中的 images 进行一些查询? (如count、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 :

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

在您的表格“Directory”中,它将以json格式将图像列表直接存储到col“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
public interface LoadDirectoryWithImagesDao {
@Query("SELECT * FROM directory")
public List<DirectoryWithImages> loadDirectoriesWithImages();
}

希望有帮助!

关于android - 使用 android room 持久性库在对象内插入对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50289494/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com