我在Android上使用AWS AppSync(GraphQL)。 AppSync SDK 2.10.0。我认为这也适用于非AppSync Apollo,但我不确定。
如果我实现了一个CacheKeyResolver
以指定自定义CacheKey
,则我发现从列表查询返回的项目(例如getOrders()
)被缓存,但是当我随后通过使用列表中某个项目的ID的ID(例如getOrder(5)
),则在缓存中找不到该项目。而是将发出网络请求,并将再次缓存该项目。然后将从缓存中返回对getOrder(5)
的另一个调用。
使用内置CacheKeyResolver
时不会发生此行为。使用内置解析器,通过getOrders()
通过ID调用(根据文档 https://aws-amplify.github.io/docs/android/api#client-architecture )可以正确地在getOrder()
调用中缓存的所有项目都在缓存中找到。 https://aws-amplify.github.io/docs/sdk/android/api#client-architecture。
这是我的Kotlin CacheKeyResolver
:
object : CacheKeyResolver() {
override fun fromFieldRecordSet(field: ResponseField, recordSet: MutableMap<String, Any>): CacheKey {
val t = recordSet["__typename"]
return formatCacheKey(StringBuilder().append(t).append(recordSet["id"].toString()).toString())
}
override fun fromFieldArguments(field: ResponseField, variables: Operation.Variables): CacheKey {
return CacheKey.NO_KEY
}
private fun formatCacheKey(key: String?): CacheKey {
return if (key == null || key.isEmpty()) {
CacheKey.NO_KEY
} else {
CacheKey.from(key)
}
}
}
似乎我做错了什么,或者这是一个错误。我们如何解决这个问题?
除了可能相关之外:我之所以使用自定义CacheKeyResolver
的原因是由于我在此处报告的此错误:https://github.com/awslabs/aws-mobile-appsync-sdk-android/issues/242