Возвращение Single <Long>в @Insert в Android Комната не работает - PullRequest
1 голос
/ 09 марта 2020

Так что мне нужно получить идентификатор вставленного элемента обратно из функции вставки. Несколько источников, включая этот от Google, говорят, что это можно сделать через Single в качестве возвращаемого значения аннотированной функции DAO @Insert. К сожалению, компиляция всегда завершается с:

xxx\CarDao.java:19: error: Not sure how to handle insert method's return type. public abstract java.lang.Object insert(@org.jetbrains.annotations.NotNull()

Я пытался изменить его на Maybe , Single и др c. но это всегда одна и та же ошибка.

Мой код выглядит так:

import androidx.lifecycle.LiveData
import androidx.room.*
import io.reactivex.Single


@Dao
interface CarDao {
    @Query("SELECT * FROM cars")
    fun getAll(): LiveData<List<Car>>

    @Query("SELECT * FROM cars WHERE uid = :uid")
    fun getById(uid: Int): Single<List<Car>>

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insert(car: Car): Single<Long>>

    @Query("DELETE FROM cars WHERE uid = :uid")
    suspend fun deleteById(uid: Int)

}

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

ОБНОВЛЕНИЕ: найдено очень странное решение: когда я удаляю ключевое слово suspend компилируется без проблем. Тогда проблема становится невозможностью доступа к базе данных из основного потока. Почему это работает без приостановки, но не с приостановкой?

1 Ответ

2 голосов
/ 09 марта 2020

Вы используете

suspend fun insert(car: Car): Single<Long>

, который использует и сопрограммы (suspend) и Rx (Single). Комната не позволяет вам использовать оба одновременно (и при этом не имеет никакого смысла, поскольку достаточно одного из них) - вам нужно выбрать, какую асиную c технику вы хотите.

Поэтому вы можете использовать Сопрограммы с:

suspend fun insert(car: Car): Long

Или Rx:

fun insert(car: Car): Single<Long>
...