Комната запрашивает отношения "один ко многим"

Как мы можем запросить все сущности с их отношениями "один ко многим" с Room?

Допустим, у нас есть объект-пользователь:

@Entity
class User(@PrimaryKey(autoGenerate = true) var id: Long?, var name: String)

и Домашнее животное:

@Entity(foreignKeys = [(ForeignKey(entity = User::class,
    parentColumns = ["id"],
    childColumns = ["userId"],
    onDelete = ForeignKey.CASCADE))])
public class Pet(@PrimaryKey(autoGenerate = true),
    var name: String,
    var userId: Long?,
    @Ignore var user: User?)

Обычно мы опрашиваем всех питомцев следующим образом:

@Dao
interface PetsDao {
    @Query("SELECT * FROM pets")
    fun getAll(): Flowable<List<Pet>>
}

Но как сделать так, чтобы Пользователь автоматически прикреплялся к объекту Домашнее животное? Как бы запрос был:

@Dao
interface PetsDao {
    @Query("SELECT * FROM pets p JOIN users u ON u.id = p.userId")
    fun getAllWithUser(): Flowable<List<Pet>>
}

И тогда мы могли бы использовать pet.user.name без необходимости отдельно запрашивать пользователя.


person rikuw    schedule 27.03.2018    source источник


Ответы (1)


Вам следует использовать @Embedded (ресурс: https://developer.android.com/reference/android/arch/persistence/room/Relation.html).

person webzooh    schedule 27.03.2018
comment
@Embedded будет работать очень хорошо, чтобы получить список домашних животных в пользователе, я действительно не понимаю, как получить пользователя от самого питомца (наоборот). Не могли бы вы привести пример с этим вариантом использования? - person BapediBoupi; 18.12.2018