Невозможно выбрать данные с отношением в LiveData из Android Room - PullRequest
0 голосов
/ 17 октября 2019

У меня есть несколько вложенных сущностей:

data class Issue {
  val id: String
  //...
}

data class Event {
  val id: String,
  val isseuId: String
  //...
}

data class Document {
  val id: String,
  val eventId: String
  //...
}

И некоторые сущности, которые их объединяют:

data class IssueWithEvents(
    @Embedded val issue: Issue,

    @Relation(
        parentColumn = "id",
        entityColumn = "issueId",
        entity = Event::class
    ) var events: List<EventWithDocuments>
)

data class EventWithDocuments(
    @Embedded val event: Event,
    @Relation(
        parentColumn = "id",
        entityColumn = "eventId",
        entity = Document::class
    ) var documents: List<Document>
)

Тогда есть Дао:

@Dao interface IssueWithEventsDao {
    @Query("SELECT * from Issue WHERE syncStatus == 'New'")
    fun getNewIssuesWithEvents(): List<IssueWithEvents>

    @Query("SELECT * FROM Issue WHERE id == :issueId")
    fun liveIssueWithEvents(issueId: String): LiveData<IssueWithEvents>

    @Query("SELECT * FROM Issue WHERE id == :issueId")
    suspend fun issueWithEvents(issueId: String): IssueWithEvents
}

Странно то, что getNewIssuesWithEvents и issueWithEvents работают хорошо, а liveIssueWithEvents - нет.

PS Забыл упомянуть, как я их называю ... этот код работает хорошо:

class IssuePreviewViewModel(val issue: Issue) : ViewModel(), KoinComponent {

    private val repo: IssueRepository by inject()

    val liveIssueWithReferencedData: LiveData<IssueWithEvents> = MutableLiveData()

    init {
        viewModelScope.launch {
            val issueWithData = repo.issueWithEvents(issue.id)
            (liveIssueWithReferencedData as MutableLiveData).value = issueWithData
        }
    }
}

Но он не подписывается на изменения, поэтому моя первоначальная попытка была такой:

class IssuePreviewViewModel(val issue: Issue) : ViewModel(), KoinComponent {

    private val repo: IssueRepository by inject()

    val liveIssueWithReferencedData: LiveData<IssueWithEvents> = repo.liveIssueWithEvents(issue.id)
}

И это не работает. liveIssueWithReferencedData.value всегда null.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...