В комнате, как указать отношение родительского объекта в POJO? - PullRequest
0 голосов
/ 30 мая 2019

В Androidx Room, как получить все отношения сущностей в POJO?

У меня есть следующая структура базы данных, где A является родителем B, а B является родителем C:

@Entity(tableName="a")
class A(){
  @PrimaryKey
  var id: Long = 0L,

  var name: String = ""
}

@Entity(tableName= "b",
        foreignKeys = arrayOf(
            ForeignKey(
                entity = A::class,
                parentColumns = arrayOf("id"),
                childColumns = arrayOf("a_id"),
                onDelete = ForeignKey.CASCADE
                ))
)
class B() {
  @PrimaryKey(autoGenerate = true)
  var id: Long = 0L,

  @ColumnInfo(name="a_id")
  var aId: Long = 0L,

  var name: String = ""
)

@Entity(tableName= "c",
        foreignKeys = arrayOf(
            ForeignKey(
                entity = B::class,
                parentColumns = arrayOf("id"),
                childColumns = arrayOf("b_id"),
                onDelete = ForeignKey.CASCADE
                ))
)
data class C (
    @PrimaryKey(autoGenerate = true)
    var id: Long = 0L,

    @ColumnInfo(name ="b_id")
    var bId: Long = 0L,

    var name: String = ""
)

Я хочу написать POJO, который должен содержать B и все его C и его родительский A:

class BAndAllCs {
   @Embedded
   var b: B? = null

   @Relation(parentColumn = "id",
             entityColumn = "b_id",
             entity= C::class)
   var c_all: List<C> = ArrayList()

   //how to retrieve parent A of B? 
}

Так, чтобы в BDao я мог добавить это:

@Transaction
@Query("SELECT * FROM B")
List<BAndAllCs> getAllB();

Возможно ли встраивать родительский элемент "b" в "a"?Есть ли способ идиоматически закодировать этот вид использования?Любая рекомендуемая лучшая практика для этого?

1 Ответ

0 голосов
/ 03 июня 2019

Вместо встраивания родительского объекта A, просто получите соответствующие поля из A в POJO, используя внутреннее соединение в Dao.

ДАО:

@Transaction
@Query("SELECT B.*, A.name as a_name FROM B inner join A on b.a_id = a.id")
List<BAndAllCs> getAllB();

POJO:

class BAndAllCs {
   @Embedded
   var b: B? = null

   @ColumnInfo("a_name")
   var aName: String = ""

   @Relation(parentColumn = "id",
             entityColumn = "b_id",
             entity= C::class)
   var c_all: List<C> = ArrayList()
}
...