ApolloStore
Apollo Kotlin公开了ApolloStore
API以程序化地读取和写入标准化缓存。该ApolloStore
位于规范化缓存之上,公开了一个线程安全的API以及使读取和写入片段和操作更简单的各种方法。
该存储可以通过ApolloClient.apolloStore
扩展访问:
val apolloClient = ApolloClient.Builder().serverUrl("https://example.com/graphql").normalizedCache(MemoryCacheFactory(maxSizeBytes = 10 * 1024 * 1024)).build()val apolloStore: ApolloStore = apolloClient.apolloStore
请注意,读写操作是同步的,如果底层的缓存正在进行IO操作(例如,SQLite缓存)。因此,应避免从主线程调用它们。
读取操作数据
就像普通的GraphQL查询一样,使用存储的主要方式是读取和写入查询:
给定以下查询:
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)
注意您需要将数据通过operation传递。
读取和写入片段
在GraphQL规范中,片段始终是更大operation的一部分,不能独立执行。
fragment BookDetails on Book {idtitleauthor {name}}
Apollo Kotlin对此规则例外,并允许读取/写入单个片段。此功能默认禁用,可通过generateFragmentImplementations
启用:
apollo {service("service") {generateFragmentImplementations.set(true)}}
由于片段没有根,您需要指定片段的根缓存ID:
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()
来清除所有条目的缓存。