Вставьте связь «один ко многим» с помощью библиотеки постоянства помещения - PullRequest
0 голосов
/ 06 июля 2018

У меня есть ситуация, когда я хочу вставить данные в таблицы Master (store_master) и Mapping (store_mapping) в отношении один-ко-многим, используя библиотеку постоянства Room. Моя реализация ниже:

@Entity(tableName = "store_master")
class Store {

@PrimaryKey(autoGenerate = true)
public var store_id: Int = 0

@SerializedName("name")
lateinit var store_name: String
}

@Entity(tableName = "store_mapping", foreignKeys = arrayOf(
    ForeignKey(entity = Store::class,
            parentColumns = arrayOf("store_id"),
            childColumns = arrayOf("pic_id"),
            onDelete = CASCADE)))
class StorePicture(@field:PrimaryKey(autoGenerate = true)
          @ColumnInfo(name = "id") var id: Int,
          @SerializedName("pic_id") var pic_id: Int?,
          @SerializedName("image") var storage_picture: String?)

 class StoreWithPictures {
    @Embedded
    var store: Store? = null

    @Relation(parentColumn = "store_id",
        entityColumn =  "pic_id")
    var pictures: List<StorePicture> = ArrayList()
}

Для получения Store with Pictures моя реализация ниже:

@Transaction
@Query("SELECT * FROM store_master  ORDER BY store_master.storage_id DESC")
fun loadAll(): List<StoreWithPictures>

Приведенный выше подход прекрасно работает для извлечения данных из главной таблицы и таблицы сопоставления, но я не могу вставить их таким же образом (т. Е. Используя аннотации @Embeded и @transaction).

1 Ответ

0 голосов
/ 06 октября 2018

Я исправил эту проблему с помощью @Transaction аннотаций.

 @Transaction
fun insertStoreWithPictures(store: Store, pictures: List<StorePicture>) {

    insertStore(store)
    insertPictures(pictures)

}

Аннотирование метода с помощью @Transaction гарантирует, что вся база данных операции, которые вы выполняете в этом методе, будут выполняться внутри одного сделка. Транзакция завершится неудачно, когда возникнет исключение тело метода.

...