加入我们,从10月8日至10日在纽约市,了解 GraphQL 联邦和 API 平台工程的最新技巧、趋势和新闻。加入2024年纽约市的 GraphQL 大会
文档
免费开始

ApolloStore


公开了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缓存)。因此,应避免从主线程调用它们。

读取操作数据

就像普通的查询一样,使用存储的主要方式是读取和写入查询:

给定以下查询

query GetBook($id: String!) {
book(id: $id) {
title
author {
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 {
id
title
author {
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 {
id
title(locale: $locale)
}
val data = apolloClient.apolloStore.readFragment(BookDetailsImpl(locale = "en-US"), CacheKey("42"), apolloClient.customScalarAdapters)
println("Title=${data.title}")

清除缓存

通过调用 apolloClient.apolloStore.clearAll() 来清除所有条目的缓存。

上一页
监听缓存数据
下一页
HTTP缓存
评价文章评分在GitHub上编辑编辑论坛Discord

©2024Apollo Graph Inc.,简称Apollo GraphQL。

隐私政策

公司