我将为此 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 使用啥样的密钥的主要内容,如果未能解决你的问题,请参考以下文章

rsa密码体系是啥样的密码体系

数据映射器通常是啥样的?

iOS Apple TestFlight 版本需要啥样的证书和配置文件?

计算器遵循啥样的算法来查找正弦值?

默认的 GLSL 着色器是啥样的?对于版本 330

当我不能运行这个项目时,Maven 正在做啥样的魔法?