Как вернуть вновь вставленный идентификатор элемента (строки), используя android номер (Kotlin)? - PullRequest
0 голосов
/ 29 марта 2020

Я использую аналогичное решение для многих похожих тем, но все же оно не хочет работать, и не могу понять, почему:

Моя сущность

@Entity(tableName = "single_item")
data class SingleItem (
    @PrimaryKey(autoGenerate = true)
    val id: Long? = 0L,
    val name: String,
    val icon: String,
    val price: Int)

DAO

@Insert
    suspend fun insertItem(item: SingleItem): Long

Репо

suspend fun insertItem(item: SingleItem): Long {
        return myDao.insertItem(item)
    }

Viewmodel

var insertedId = 0L
fun insertItem(item: SingleItem) = viewModelScope.launch {
        insertedId = myRepository.insertItem(item)
    }

Наконец, вызов из фрагмента

val newItem = SingleItem(null, "name","icon_name", 9999)
viewModel.insertItem(newItem)
Log.i("INSERT_ID", "Inserted ID is: ${viewModel.insertedId}")

И после того, как я проверил журнал, переменная insertId всегда возвращает 0. Она не меняется. Что может быть не так?

1 Ответ

0 голосов
/ 29 марта 2020

Ваш метод insert в viewmodel запускает новую сопрограмму, он возвращает до того, как выполнил вставку, поэтому вы получаете начальное значение 0. Если вы дождетесь завершения задания, вы получите правильный идентификатор.

Измените его следующим образом, чтобы увидеть правильное значение:

var insertedId = 0L
fun insertItem(item: SingleItem) = viewModelScope.launch {
    insertedId = myRepository.insertItem(item)
    Log.i("INSERT_ID", "Inserted ID is: $insertedId")
}

Если вы хотите получить это значение в своем фрагменте, вы должны дождаться завершения задания. Лучший способ - сделать ваш метод представления insert методом suspend вместо огня и забыть.

fun insertItem(item: SingleItem) = 
    myRepository.insertItem(item)

и во фрагменте

lifecycleScope.launch {
    val id = viewModel.insertItem(item)
    Log.i("INSERT_ID", "Inserted ID is: $id")
}

, но учтите, что это неправильная архитектура, все бизнес-логики c должны быть в модели представления, а не во фрагменте.

...