Позвольте помещать handle@Insert объектов с аннотациями @Embedded и @Relation - PullRequest
0 голосов
/ 26 февраля 2020

Я прочитал тонну вопросов и статей о номерах и внешних ключах, и я почти уверен, что на самом деле не могу достичь того, что пытаюсь сделать. Также в большинстве примеров / учебных пособий объясняется только запрос выбора.

Итак, существует класс c отношение один ко многим, и я хотел бы определить объект с помощью @Embedded и @Relation, чтобы получить «один выстрел». msgstr "вставить метод для объекта, содержащего список объектов. Чтобы быть более понятным:

Лицензия:

@Entity(tableName = "licence")
data class Licence(
  @PrimaryKey(autoGenerate = true)
  @ColumnInfo(name = "licence_id")
  var licenceId: Int,
  @ColumnInfo(name = "expiration_date")
  var expirationDate: Date
  //other attributes  )

LicenceConfigurations:

@Entity(
foreignKeys = [
    ForeignKey(
        entity = Licence::class,
        parentColumns = ["licence_id"],
        childColumns = ["licence_reference"],
        onDelete = ForeignKey.CASCADE,
        onUpdate = ForeignKey.CASCADE
    )],
tableName = "licence_configurations")
data class LicenceConfig(
  @PrimaryKey(autoGenerate = true)
  @ColumnInfo(name = "licence_config_id")
  var licenceConfigId: Int,
  @ColumnInfo(name = "licence_reference")
 var licenceId: Int
//other attributes  )

LicenceWithConfigurations

data class LicenceWithConfigurations(
@Embedded
val licence: Licence,
@Relation(
    parentColumn = "licence_id",
    entityColumn = "licence_reference",
    entity = LicenceConfig::class)
val licenceConfig: List<LicenceConfig>?)

Что я пытаюсь сделать чтобы избежать @Transaction и выполнить первую вставку для License, получить идентификатор, установить идентификатор для каждой конфигурации LicenceConfiguration и выполнить другую вставку. Вместо этого я хотел бы иметь метод, подобный этому, в DAO:

@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertLicenceWithConfigurations(licenceWithConfigurations: LicenceWithConfigurations)

. Прямо сейчас ошибка «Сбой ограничения FOREIGN KEY (код 787 SQLITE_CONSTRAINT_FOREIGNKEY)», поэтому я указал @Index для класса LicenceConfig затем попытался установить внешний ключ в другом поле (потому что я прочитал, что с автоматически сгенерированным идентификатором в качестве внешних ключей это не будет работать), но все еще не работает. Могу ли я это сделать или я должен go вернуться с @Transaction и обработать вставки вручную?

1 Ответ

0 голосов
/ 28 февраля 2020

Я заставил это работать самостоятельно. Как я и думал, основной проблемой был автоматически сгенерированный int-ключ License, используемый в качестве внешнего ключа. Строка "stati c" и разделение двух объектов в методе @Insert сделали свое дело. Я оставлю это здесь, надеюсь, это поможет кому-то:

Лицензия:

@Entity(tableName = "licence")
data class Licence(
@PrimaryKey
@ColumnInfo(name = "function_id")
var functionId: String,

@ColumnInfo(name = "expiration_date")
var expirationDate: Date,
//more attributes )

LicenceConfigurations:

@Entity(
foreignKeys = [
    ForeignKey(
        entity = Licence::class,
        parentColumns = ["function_id"],
        childColumns = ["licence_reference"],
        onDelete = ForeignKey.CASCADE,
        onUpdate = ForeignKey.CASCADE
    )],tableName = "licence_configurations")
data class LicenceConfig(
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "licence_config_id")
var licenceConfigId: Int,

@ColumnInfo(name = "licence_reference")
var licenceId: Int
//more attributes )

LicenceWithConfigurations:

data class LicenceWithConfigurations(
@Embedded
val licence: Licence,
@Relation(
parentColumn = "licence_id",
entityColumn = "licence_reference",
entity = LicenceConfig::class)
val licenceConfig: List<LicenceConfig>?)

LicenceDao:

 @Transaction
 @Insert(onConflict = OnConflictStrategy.REPLACE)
 suspend fun insertLicenceWithConfigurations(licence:Licence, licenceConfigurations: List<LicenceConfig>?)

@Transaction
@Query("SELECT * FROM licence")
suspend fun getAllLicencesWithConfigurations(): List<LicenceWithConfigurations>
...