我必须在数据库中插入一个帖子,并且它包含多个图像,所以我创建了以下表格
发布表:
@Entity
data class PostTable(
var post: String,
var images : ArrayList<String>) : Parcelable{
@PrimaryKey(autoGenerate = true)
var id: Int = 0
}
图像表:
@Entity(foreignKeys = arrayOf(ForeignKey(entity = PostTable::class,
parentColumns = arrayOf("id"),
childColumns = arrayOf("imd"),
onDelete = ForeignKey.CASCADE)))
data class ImageTable (
@PrimaryKey(autoGenerate = true)
val id: Int,
val imd: Int,
val imageURL: String
)
Dao Post Table:
@Dao
interface PostDao {
@get:Query("SELECT * FROM PostTable ORDER BY id ASC")
val posts: LiveData<MutableList<PostTable>>
@Insert
fun insert(post: PostTable)
}
道图像表:
@Dao
interface ImageDao {
@Insert
fun insert(images: ImageTable)
@Query("SELECT * FROM ImageTable WHERE imd=:postID")
fun allImages(postID: Int): List<ImageTable>
}
我可以通过获取PostTable的ID将值插入PostTable中,如何将其插入 PostTable 中,并将图像插入 ImageTable 中?
答案 0 :(得分:2)
您无需在数据库级别存储帖子拥有的图像,因为每个图像都将带有指向其拥有的(父)帖子的链接。
因此,您要对var images : ArrayList<String>) : Parcelable{
使用@Ignore批注(@Ignore将其排除为表中的列)。
您想要的是提取图像路径的功能。这将使用ImageDao中的allImages查询,因此您应该将ImageDao对象传递给该函数。
因此,您的代码可能包含:-
@Ignore
internal var images = ArrayList<String>()
constructor() {}
fun getImages(imageDao: ImageDao): ArrayList<String> {
val result = ArrayList<String>()
val imageTableList = imageDao.allImages(this.id!!)
for (it in imageTableList) {
result.add(it.getImageURL())
}
return result
}
fun getImages(): ArrayList<String> {
return this.images
}
fun setImages(imageDao: ImageDao) {
this.images = getImages(imageDao)
}
然后,您可以使用getImages()
来检索setImages(your_ImageDao_instance)
存储的ArrayList(必须运行以保持映像更新),或者可以使用getImages(your_ImageDao_instance)
(获取根据数据库的imageUrl的值(即在PostTable中就不需要images变量了)。