使用 android 房间持久性库在对象中插入对象
Insert an object inside an object using android room persistence library
目录
@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 个选项,具体取决于您需要如何访问 Image 对象。
您可以只从 Directory 对象中获取图像列表,还是需要对数据库中的 images 进行一些查询? (例如计数、查找等...)
第一个选项,如果您只想在您的目录对象中获取图像列表(可能是最适合您的情况):
@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'
在您的table“目录”中,它会将图像列表直接存储到col“images中",采用 json 格式。
第二个选项,如果你只是想为你的图像使用不同的table并对它们执行查询。
您将需要使用一对多关系并拥有 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();
}
希望对您有所帮助!
目录
@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 个选项,具体取决于您需要如何访问 Image 对象。 您可以只从 Directory 对象中获取图像列表,还是需要对数据库中的 images 进行一些查询? (例如计数、查找等...)
第一个选项,如果您只想在您的目录对象中获取图像列表(可能是最适合您的情况):
@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'
在您的table“目录”中,它会将图像列表直接存储到col“images中",采用 json 格式。
第二个选项,如果你只是想为你的图像使用不同的table并对它们执行查询。
您将需要使用一对多关系并拥有 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();
}
希望对您有所帮助!