Комната получает идентификатор из метода execute - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть фрагмент с RecyclerView и FloatingActionButton.При нажатии на клавишу FAB открывается диалоговое окно с настройками для нового элемента.Нажав на положительную кнопку, я вставляю новый элемент в базу данных, выполняя следующие шаги:

1) Вызов из диалога

viewModel.createItem()

2) В ViewModel

fun createItem() {
    return repository.insertItem(Item("${name.value}"))
}

3) Репозиторий выглядит как

@Singleton
class Repository @Inject constructor(
    private val appExecutors: AppExecutors,
    private val itemDao: ItemDao
) {

    fun insertItem(item: Item) {
        appExecutors.diskIO().execute{ itemDao.insert(item) }
    }

    fun loadItemList() = itemDao.getItemList()
}

4) Дао

@Dao
interface ItemDao {
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insert(item: Item) : Long

    @Query("SELECT * FROM item ORDER BY name")
    fun getItemList() : LiveData<List<Item>>
}

5) Элемент

@Entity (tableName = "item")
data class Item(
        @PrimaryKey(autoGenerate = true) @ColumnInfo(name = "_id") val id: Long,
        @ColumnInfo(name = "name") val name: String
) {
    @Ignore
    constructor(name: String) : this(0, name)
}

А затем я хочу перейти кфрагмент детали для вставленного элемента.Поэтому мне нужен идентификатор этого элемента, который возвращается Room.Но как я могу вернуть идентификатор из метода execute в хранилище?Или, может быть, вы знаете другой способ сделать это.

Ps Я использую Dagger и все библиотеки компонентов архитектуры.

1 Ответ

0 голосов
/ 19 сентября 2018

itemDao.insert(item) уже возвращает идентификатор нового элемента.Теперь вам нужно отправить этот идентификатор обратно во внешний интерфейс (или там, где вы хотите использовать новый идентификатор) с помощью обратного вызова.

Вы можете создать прослушиватель:

interface ItemInsertedListener {
    fun onItemInserted(itemId: Long)
}

Добавьте интерфейс в качестве необязательного аргумента для вашего insertItem метода:

fun insertItem(item: Item, callback: ItemInsertedListener?) {
    appExecutors.diskIO().execute {
        val id = itemDao.insert(item)
        callback?.onItemInserted(id)
    }
}

И, наконец, передайте ItemInsertedListener вашему репо в вашем createItem методе.Когда обратный вызов возвращается, вы можете перенаправить пользователя во фрагмент, учитывая, что активность все еще видна.Также имейте в виду, что обратный вызов может выполняться в другом потоке, поэтому перед изменением пользовательского интерфейса явно переключитесь на поток пользовательского интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...