Вставка данных в таблицу внешних ключей в SQLite Android - PullRequest
1 голос
/ 01 октября 2019

Мне нужно вставить сообщение и несколько изображений в базу данных, поэтому я создал следующие таблицы

Стол сообщений:

@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
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, как вставить в PostTable и его изображения в ImageTable , получив идентификатор PostTable?

1 Ответ

2 голосов
/ 02 октября 2019

Вам не нужно хранить изображения, принадлежащие сообщению, на уровне базы данных, поскольку каждое изображение будет храниться со ссылкой на свою (родительскую) запись.

Поэтому вы хотите использовать @Игнорировать аннотацию для var images : ArrayList<String>) : Parcelable{ (@Ignore исключает, что это столбец в таблице).

Вам нужна функция для извлечения путей к изображениям. При этом использовался бы запрос allImages, как в ImageDao, поэтому вы должны передать объект 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(), чтобы получить ArrayList, сохраненный с помощью setImages(your_ImageDao_instance) (который должен быть запущен для обновления изображений), или, альтернативно, вы можете использовать getImages(your_ImageDao_instance) (который получает imageUrl в соответствии с базой данных (то есть тогда будетпеременная images в PostTable не нужна)).

  • Обратите внимание, что приведенный выше код является принципиальным кодом, он не был протестирован или выполнен и поэтому может содержать некоторые ошибки.
...