Комната Android: Можно ли использовать значение вызова в LiveData для возврата простых данных? - PullRequest
0 голосов
/ 30 января 2019

Допустим, у меня есть функция DAO для комнаты getForIdLiveData(id: String), которая возвращает LiveData<SomeClass>.

Безопасно ли (и как это с точки зрения производительности) использовать someClassDAO.getForIdLiveData(id).value вместо создания дублирующей функции DAO, которая возвращает просто SomeClass?

Это сэкономило бы тонну шаблонной информациикод (поскольку функции DAO обычно передаются через репозиторий в MVP или MVVM), и он, кажется, работает до сих пор.Я просто не смог найти много информации о возможных будущих осложнениях, которых я (конечно) хочу избежать.

Пример:

Могу ли я использовать это:

В someDataClassDAO

    @Query("SELECT * FROM my_table WHERE my_id = :id")
    fun getForIdLiveData(id: String): LiveData<SomeDataClass>

В MyRepo интерфейс

    getMyInfoLiveData(id: String): LiveData<SomeDataClass>

В myRepoFactory, который реализует пользовательский интерфейс MyRepo

    @WorkerThread
    override fun getMyInfoLiveData(id: String)
        = someDataClassDAO.getForIdLiveData(id)

В myViewModel класс

    // Provide LiveData for ongoing UI display
    fun provideMyInfoLiveData(id: String) = myRepo.getMyInfoLiveData(id)

    // Get some parameter for different id (one time)
    fun getOneParameter(id): Long {
        val entity = myRepo.getMyInfoLiveData(id).value
        return entity.someField
    }

Вместо:

В someDataClassDAO

    @Query("SELECT * FROM my_table WHERE my_id = :id")
    fun getForIdLiveData(id: String): LiveData<SomeDataClass>

    @Query("SELECT * FROM my_table WHERE my_id = :id")
    fun getForId(id: String): SomeDataClass

В MyRepo интерфейс

    getMyInfoLiveData(id: String): LiveData<SomeDataClass>
    getMyInfo(id: String): SomeDataClass

В MyRepoFactory, который реализуетMyRepo

    @WorkerThread
    override fun getMyInfoLiveData(id: String)
        = someDataClassDAO.getForIdLiveData(id)

    @WorkerThread
    override fun getMyInfo(id: String)
        = someDataClassDAO.getForId(id)

В myViewModel класс

    // Provide LiveData for ongoing UI display
    fun provideMyInfoLiveData(id: String) = myRepo.getMyInfoLiveData(id)

    // Get some parameter for different id (one time)
    fun getOneParameterForId(id): Long {
        val entity = myRepo.getMyInfo(id)
        return entity.someField
    }

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Безопасно ли (и как это с точки зрения производительности) использовать someClassDAO.getForIdLiveData(id).value вместо создания дублирующей функции DAO, которая возвращает только SomeClass?

Это не имеет ничего общего с«с точки зрения производительности», это просто сглаживание не будет работать .

LiveData<T> оценивается асинхронно, когда есть активный наблюдатель.

T оценивается синхронно и возвращается немедленно (доступ к вводу-выводу, блокировка).

Таким образом, вы просто получите ноль, и все не будет работать вообще.Вам нужны два метода.

Я предпочитаю называть их getForIdWithChanges вместо getForIdLiveData, учитывая, что вы действительно знаете, что это LiveData из системы типов.

0 голосов
/ 30 января 2019

Если вам нужны оба варианта (LiveData и обычный результат), ypu должен создать 2 варианта метода в DAO.Все остальное взломать.

...