DataStore を Apollo に移行
このページでは、すべての Amplify.DataStore.* 呼び出しを同等の Apollo Kotlin 操作に置き換える方法を説明します。以下の例は、スキーマと GraphQL 操作ページで作成されたスキーマと GraphQL 操作を使用しています。
作成、更新、削除 (保存/削除)
Apollo Kotlin では、スキーマで定義されたミューテーションを使用してデータを作成、更新、削除します。
// Create — include all required fields from your schemaval input = CreatePostInput( title = title, content = content, rating = Optional.present(rating), status = status)val response = apolloClient.mutation(CreatePostMutation(input)).execute()
// Update — use Optional.present() for fields you want to change.// Pass _version from the last query/mutation response for conflict resolution.val input = UpdatePostInput( id = post.id, status = Optional.present(PostStatus.ACTIVE), _version = Optional.present(post._version))val response = apolloClient.mutation(UpdatePostMutation(input)).execute()
// Delete — also requires _version for conflict resolutionval input = DeletePostInput( id = post.id, _version = Optional.present(post._version))val response = apolloClient.mutation(DeletePostMutation(input)).execute()クエリ
Apollo Kotlin では、スキーマで定義されたクエリを使用してデータをクエリします。
// Single itemval query = GetPostQuery(id = id)val response = apolloClient.query(query).execute()
// List itemsval response = apolloClient.query(GetPostsQuery()).execute()フィルタリング
DataStore は述語クエリ (例: Post.RATING.gt(3)) をサポートしていました。これらはローカルで実行されました。Apollo では 2 つのオプションがあります:
- サーバー側フィルタリング AppSync の
ModelPostFilterInputを使用します。GetPostsクエリを更新してフィルタを受け入れるようにします:
query GetPosts($filter: ModelPostFilterInput, $nextToken: String) { listPosts(filter: $filter, nextToken: $nextToken) { items { ... PostDetails } nextToken }}その後、Kotlin でフィルタを渡します:
val filter = ModelPostFilterInput( rating = Optional.present(ModelIntInput(gt = Optional.present(3))))val response = apolloClient.query( GetPostsQuery(filter = Optional.present(filter))).execute()- クライアント側フィルタリング クエリ結果に対して Kotlin コレクション操作を使用します:
val allPosts = response.data?.listPosts?.items ?.mapNotNull { it?.postDetails } ?: emptyList()val filtered = allPosts.filter { (it.rating ?: 0) > 3 }ソート
DataStore の QuerySortBy はデフォルトの listPosts クエリに対して直接の Apollo 相当物がありません。クライアント側でソートを適用します:
val sorted = posts.sortedByDescending { it.createdAt?.toString() ?: "" }ページネーション
DataStore はオフセットベースのページネーション (Page.startingAt(n).withLimit(5)) をサポートしていました。AppSync は nextToken を使用したカーソルベースのページネーションを使用します。nextToken を使用してすべての結果をページネーションするか、.drop() と .take() を使用してクライアント側のオフセットページネーションを適用できます:
val page = 0val pageSize = 5val pagedPosts = allPosts.drop(page * pageSize).take(pageSize)監視
Apollo Kotlin では、スキーマで定義されたサブスクリプションを使用してデータを監視します。Apollo Kotlin は組み込みの toFlow() メソッド経由でサブスクリプションを Kotlin Flow として公開します:
apolloClient.subscription(OnCreateSubscription()).toFlow().collect { response -> // Handle created post}ObserveQuery
DataStore の observeQuery では、クエリを送信した後、結果が変更されたときに更新を受け取ることができます。Apollo Kotlin でこの動作をレプリケートするには、正規化キャッシュと watch 関数を使用します。
これを設定するには、以下を実行する必要があります:
- 正規化キャッシュ依存関係を追加します
build.gradle.ktsに:
implementation("com.apollographql.apollo:apollo-normalized-cache:4.1.0")// For SQLite-backed persistent cache:implementation("com.apollographql.apollo:apollo-normalized-cache-sqlite:4.1.0")- キャッシュを設定します Apollo クライアントを構築するときに:
val cacheFactory = MemoryCacheFactory(maxSizeBytes = 10 * 1024 * 1024)// Or for SQLite: SqlNormalizedCacheFactory(context, "apollo_cache.db")
val apolloClient = ApolloClient.Builder() .serverUrl(endpoint.serverUrl.toString()) .addHttpInterceptor(AppSyncInterceptor(authorizer)) .normalizedCache(cacheFactory) .build()- クエリを監視します 更新を受け取るために:
val query = GetPostQuery(id = id)apolloClient.query(query).watch().collect { post -> // This re-emits whenever the cached data for this query changes}クイックリファレンステーブル
| DataStore メソッド | Apollo Kotlin 相当物 | 主な違い |
|---|---|---|
Amplify.DataStore.save() (作成) | apolloClient.mutation(CreatePostMutation(input)).execute() | 作成時に _version は不要 |
Amplify.DataStore.save() (更新) | apolloClient.mutation(UpdatePostMutation(input)).execute() | 最後のクエリから _version を渡す必要があります |
Amplify.DataStore.delete() | apolloClient.mutation(DeletePostMutation(input)).execute() | 最後のクエリから _version を渡す必要があります |
Amplify.DataStore.query() (単一) | apolloClient.query(GetPostQuery(id)).execute() | 見つからない場合は null を返します |
Amplify.DataStore.query() (リスト) | apolloClient.query(GetPostsQuery()).execute() | _deleted レコードをフィルタリングする必要があります |
Amplify.DataStore.observe() | apolloClient.subscription(...).toFlow().collect {} | イベントタイプごとに別個のサブスクリプション |
Amplify.DataStore.observeQuery() | apolloClient.query(...).watch().collect {} | 正規化キャッシュのセットアップが必要 |
Amplify.DataStore.clear() | 不要になりました | クリアする DataStore はありません |