ApolloStore
Apollo Kotlin公开了ApolloStore
API,以编程方式从正常化的缓存中读取和写入。该ApolloStore
构建在NormalizedCache
之上,提供了一个线程安全的API,以及使读取和写入片段和操作更简单的
该存储可以通过ApolloClient.apolloStore
扩展访问:
val apolloClient = ApolloClient.Builder().serverUrl("https://...").normalizedCache(MemoryCacheFactory(maxSizeBytes = 10 * 1024 * 1024)).build()val apolloStore: ApolloStore = apolloClient.apolloStore
读取操作数据
就像一个普通的GraphQL查询一样,使用商店的主要方式是读取和写入查询:
给定以下query:
query GetBook($id: String!) {book(id: $id) {titleauthor {name}}}
您可以这样读取它
val data = apolloClient.apolloStore.readOperation(GetBookQuery(id = "42"), apolloClient.customScalarAdapters)println("Title=${data.title}")println("Author Name=${data.author.name}")
在缓存缺失的情况下,readOperation
将抛出异常:
try {apolloClient.apolloStore.readOperation(GetBookQuery(id = "42"), apolloClient.customScalarAdapters)} catch(e: CacheMissException) {println("CacheMiss on key: ${e.key}.${e.fieldName}")}
如果您在运行时声明了标量适配器,将您的客户端customScalarAdapters
传递给商店的方法,因为商店需要它们将标量值转换为Kotlin/Java类型。
写入操作数据
写入操作数据与读取相似:
apolloClient.apolloStore.writeOperation(GetBookQuery(id = "42"), data, apolloClient.customScalarAdapters)
请注意,您需要将数据传递给操作。
读取和写入片段
在GraphQL规范中,片段始终是更大操作的一部分,不能独立执行。
fragment BookDetails on Book {idtitleauthor {name}}
Apollo Kotlin对此规则做出了例外,并允许读取/写入单独的片段。默认情况下,此功能是禁用的,可以启用generateFragmentImplementations
:
apollo {service("service") {generateFragmentImplementations.set(true)}}
由于片段没有根节点,您需要指定片段的根缓存标识符:
val data = apolloClient.apolloStore.readFragment(BookDetailsImpl(), CacheKey("42"), apolloClient.customScalarAdapters)println("Title=${data.title}")println("Author Name=${data.author.name}")
片段可以包含变量。不同变量不同的片段可以返回不同的数据。在这种情况下,Impl
类将需要变量作为构造函数参数:
fragment BookDetails on Book {idtitle(locale: $locale)}
val data = apolloClient.apolloStore.readFragment(BookDetailsImpl(locale = "en-US"), CacheKey("42"), apolloClient.customScalarAdapters)println("Title=${data.title}")
清除缓存
调用apolloClient.apolloStore.clearAll()
来清除所有条目的缓存。