我将为此 StoreBuilder 使用啥样的密钥
Posted
技术标签:
【中文标题】我将为此 StoreBuilder 使用啥样的密钥【英文标题】:What kind of key would I use for this StoreBuilder我将为此 StoreBuilder 使用什么样的密钥 【发布时间】:2020-05-06 23:38:11 【问题描述】:所以我正在试用 Store 4 (https://github.com/dropbox/Store),它有一个简单的 android 应用程序,该应用程序从这个占位符网站获取数据:https://jsonplaceholder.typicode.com/
第一个屏幕是所有用户的列表。我想在您第一次打开应用程序时获取它们。但是当您重新打开应用程序或返回第一个屏幕时,我想先从房间数据库中获取它,然后再从互联网上获取它们(数据库没有改变的事实是微不足道的)。
我希望我的 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】:这是关键描述:
Store 使用通用键作为数据的标识符。键可以是正确实现 toString()、equals() 和 hashCode() 的任何值对象。当您的 Fetcher 函数被调用时,它将被传递一个特定的 Key 值。同样,该键将用作缓存中的主要标识符(确保具有正确的 hashCode()!!)。
关键是定义你的数据,你用作key的对象必须覆盖hashCode
方法,定义你自己的规则。
这里有一些在商店里的用处:
suspend fun Store.get(key: Key): Value:此方法返回给定键的单个值。如果可用,它将从内存缓存或持久化器中返回
根据你设置的key返回数据。它的作用是hashmap
中的key
【讨论】:
好的,所以我每次尝试获取所有用户时是否应该只生成一个随机整数?似乎我有义务使用特定变量(如 ID)获取我的用户,但在这种情况下,我想从特定地址获取所有用户 我建议您使用唯一且固定的数据作为键,而不是随机整数。所有用户键都可以这样“all+usertype-function” 这意味着我将在我的 dao 中有一个插入函数,它也应该接受一个始终包含任意字符串的字符串,如“all+usertype-function”?这听起来像是糟糕的代码。这是我可以提出问题的地方吗?A key can be any value object that properly implements toString()
,我只展示id的示例信息,对于数据库,它通常使用rawid作为唯一键以上是关于我将为此 StoreBuilder 使用啥样的密钥的主要内容,如果未能解决你的问题,请参考以下文章