Я использую 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
)