将数据插入SQLite Android中的外键表

时间:2019-10-01 10:56:26

标签: android sqlite android-sqlite android-room

我必须在数据库中插入一个帖子,并且它包含多个图像,所以我创建了以下表格

发布表:

@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 中?

1 个答案:

答案 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变量了)。

  • 请注意,以上代码是内部代码,尚未经过测试或运行,因此可能包含一些错误。