Как использовать функцию приостановки на Room Db? - PullRequest
1 голос
/ 04 февраля 2020

Я использую Room Db, используя сопрограммы в kotlin. Это мой интерфейс Дао:

@Dao
interface CheckListNameDao {

    @Insert
    suspend fun insertName(name: CheckListName)


    @Query("SELECT * FROM CheckListNamesTable")
    fun getAllNames(): LiveData<List<CheckListName>>
}

getAllNames() метод работает отлично. Проблема в методе insertName(). Когда я удаляю ключевое слово suspend из метода insertName(), оно выдает следующее исключение: java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time. Но, когда я использую ключевое слово suspend, я больше не могу построить проект. Он показывает следующую ошибку:

error: Methods annotated with @Insert can return either void, long, Long, long[], Long[] or List<Long>.
public abstract java.lang.Object insertName(@org.jetbrains.annotations.NotNull()

Почему эта ошибка отображается? Мой код основан на этом Android Комната с видом - Kotlin

Редактировать: Это мой репозиторий:

class MainRepository(application: Application) {

        private var nameDao: CheckListNameDao = AppDatabase.getDatabase(application.applicationContext)
                .checkListNameDao()

        fun getAllNames(): LiveData<List<CheckListName>> {
            return nameDao.getAllNames()
        }

        suspend fun setNewListName(checkListName: CheckListName) {
            nameDao.insertName(checkListName)
        }
    }

Это модель представления:

class MainViewModel(application: Application) : AndroidViewModel(application) {

    private var mainRepository = MainRepository(application)

    fun getAllNames(): LiveData<List<CheckListName>> {
        return mainRepository.getAllNames()
    }

    fun setNewListName(name: String) {
        viewModelScope.launch {
            mainRepository.setNewListName(CheckListName(0, name))
        }
    }
}

РЕДАКТИРОВАТЬ 2:

Я также получаю эту ошибку при добавлении ключевого слова suspend:

error: Type of the parameter must be a class annotated with @Entity or a collection/array of it.
kotlin.coroutines.Continuation<? super kotlin.Unit> p1);

Это класс данных CheckListName:

@Entity(tableName = "CheckListNamesTable")
data class CheckListName(

        @PrimaryKey(autoGenerate = true)
        var id: Int,

        var name: String
)

Ответы [ 3 ]

1 голос
/ 04 февраля 2020

Следующий фрагмент кода содержит пример конфигурации базы данных с одним объектом и одним DAO:

@Entity
data class User(
    @PrimaryKey val uid: Int,
    @ColumnInfo(name = "first_name") val CheckListName: String?,
)
1 голос
/ 04 февраля 2020

В соответствии с документацией Room Decalaring Dependencies вам нужна зависимость от room-ktx для использования сопрограмм и, с этим, suspend методы:

implementation "androidx.room:room-ktx:2.2.3"
0 голосов
/ 04 февраля 2020

Добавьте модификатор ключевого слова suspend в методы класса Dao, чтобы использовать приостановку.

    @Dao
    interface TaskDao {
        @Insert(onConflict = OnConflictStrategy.REPLACE)
        suspend fun insertTask(t: Task): Long
        @Query(value = "SELECT * FROM tasks")
        suspend fun tasks(): List<Task>
        @Update
        suspend fun updateTask(t: Task)
        @Delete
        suspend fun deleteTask(t: Task)
    }

Наряду с @Insert, @Update и @Delete метод аннотации @Query также поддерживает ключевое слово suspend. , После добавления приостановки наши методы класса Dao могут выполняться, не блокируя текущий поток. Используйте ссылку ниже для справки -

как использовать suspend в базе данных комнат

...