Какой ключ я бы использовал для этого StoreBuilder - PullRequest
1 голос
/ 21 января 2020

Итак, я пробую Store 4 (https://github.com/dropbox/Store) с помощью простого android приложения, которое извлекает данные с этого сайта-заполнителя: https://jsonplaceholder.typicode.com/

На первом экране будет список всех пользователей. Я хочу получить их при первом запуске приложения. Но когда вы снова открываете приложение или возвращаетесь к первому экрану, я хочу сначала извлечь его из базы данных комнаты, а затем извлечь их из целого числа rnet (факт, что база данных не изменяется, тривиален).

Я ожидаю, что моя ViewModel должна будет принять объект, созданный StoreBuilder, поэтому я создаю определение этого объекта в моем DI (Koin). StoreBuilder продолжает просить меня предоставить ключ. И я начинаю подозревать, что Store - неправильный выбор, если вы выбираете всех пользователей. Я пытаюсь использовать Store в моей программе, потому что я заинтересован в его использовании. У меня вопрос как? Или проще говоря:

Какой ключ я должен использовать в этом случае? Должен ли я использовать ключ вообще? Зачем мне нужен ключ?

Небольшая выдержка из моего кода (пока он не собирается):

object KoinModules {
    val repositoryModule = module {
        single { StoreBuilder
            .fromNonFlow { provideUserService(get()).getAll() //** THIS IS NOT WORKING **
            }.persister(
                reader = provideUserDAO(get())::getAll,
                writer = provideUserDAO(get())::insert
            )
        }
    }
}

@Dao
interface UserDao {
    @Query("SELECT * FROM UserDTO")
    suspend fun getAll(): List<UserDto>

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insert(vararg userDTO: UserDto)
}
interface UserService {
    @GET("/users")
    suspend fun getAll(): List<User>
}
@Parcelize
data class User(val id: Int, val name: String, val username: String, val email: String) : Parcelable

1 Ответ

1 голос
/ 21 января 2020

этот ключ описывает:

Магазин использует общие c ключи в качестве идентификаторов для данных. Ключом может быть любой объект значения, который правильно реализует toString (), equals () и hashCode (). Когда вызывается ваша функция Fetcher, ей будет передано определенное значение Key. Точно так же ключ будет использоваться в качестве основного идентификатора в кешах (Убедитесь, что у вас есть правильный hashCode () !!).

ключ - для определения ваших данных, объекта, который вы используете как ключ должен переопределить метод hashCode, определите свое собственное правило.

вот какое-то использование в Store:

suspend fun Store.get (key: Key): Value: Этот метод возвращает единственное значение для данного ключа. Если доступно, оно будет возвращено из кеша в памяти или из сохраненного значения

в соответствии с вашим установленным ключом для возврата данных. его функции в качестве ключа в hashmap

...