Docs
Launch GraphOS Studio

ApolloStore


exposes the ApolloStore API to read and write from the normalized cache programmatically. The ApolloStore sits on top of NormalizedCache, exposes a thread safe API as well as methods that make it easier to read and write and .

The store is accessible with the ApolloClient.apolloStore extension:

val apolloClient = ApolloClient.Builder()
.serverUrl("https://...")
.normalizedCache(MemoryCacheFactory(maxSizeBytes = 10 * 1024 * 1024))
.build()
val apolloStore: ApolloStore = apolloClient.apolloStore

Reading operation data

Just like a regular , the main way to use the store is to read and write queries:

Given the following :

query GetBook($id: String!) {
book(id: $id) {
title
author {
name
}
}
}

You can read it like this:

val data = apolloClient.apolloStore.readOperation(GetBookQuery(id = "42"), apolloClient.customScalarAdapters)
println("Title=${data.title}")
println("Author Name=${data.author.name}")

In the event of cache miss, readOperation will throw:

try {
apolloClient.apolloStore.readOperation(GetBookQuery(id = "42"), apolloClient.customScalarAdapters)
} catch(e: CacheMissException) {
println("CacheMiss on key: ${e.key}.${e.fieldName}")
}

If you declared scalar adapters at runtime, pass your client's customScalarAdapters to the store's methods, as the store will need them to convert values to and from their Kotlin/Java types.

Writing operation data

Writing data is similar to reading:

apolloClient.apolloStore.writeOperation(GetBookQuery(id = "42"), data, apolloClient.customScalarAdapters)

Note how you'll need to pass the data allong the .

Reading and Writing fragments

In the GraphQL specification, are always part of a larger and cannot be executed standalone.

fragment BookDetails on Book {
id
title
author {
name
}
}

makes an exception to that rule and allows to read/write individual . This is disabled by default and can be enabled with generateFragmentImplementations:

apollo {
service("service") {
generateFragmentImplementations.set(true)
}
}

Because are not rooted, you need to specify the root cache id of the fragment:

val data = apolloClient.apolloStore.readFragment(BookDetailsImpl(), CacheKey("42"), apolloClient.customScalarAdapters)
println("Title=${data.title}")
println("Author Name=${data.author.name}")

can contain . Different fragments with different variables can return different data. In that case the fragment Impl class will require as constructor parameters:

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}")

Clearing the cache

Call apolloClient.apolloStore.clearAll() to clear the cache of all entries.

Previous
Watching cached data
Next
HTTP cache
Edit on GitHubEditForumsDiscord

© 2024 Apollo Graph Inc.

Privacy Policy

Company