如何在 Xamarin 中使用 GraphQL 将数据存储在 Apollo 缓存中?

How to store data in Apollo cache using GraphQL in Xamarin?

我正在使用 GraphQL 通过 AppSync 同步 aws dynamoDB 中的数据。

但现在我需要存储从 GraphQL 获得的数据 API

我发现可以使用 Apollo 客户端将这些数据存储在缓存中,以便能够在离线模式下使用这些数据。

这是我使用 GraphQL 时使用的代码:

amazonAppSyncClient = new AmazonAppSyncClient ("ACCESS_KEY_ID", "SECRET_ACCESS_KEY", REGION);
graphQLClient = new GraphQLClient ("https://6vl6q5h2c5bxrbmlimiia5hldy.appsync-api.us-west-2.amazonaws.com/graphql",
    new GraphQLClientOptions {
        HttpMessageHandler = new AWS4SignerMessageHandler (
            amazonAppSyncClient,
            "ACCESS_KEY_ID",
            "SECRET_ACCESS_KEY")
    });

public async Task<List<Book>> GetAllBooks () {
    var graphQLResponse = await graphQLClient.PostQueryAsync (@"query getBooks {
      listBooks {
      items {
      Id
      Title
      ISBN
      Price
      PageCount
      Author}}}");

    var json = graphQLResponse.Data;
    var value = json.GetValue ("listBooks").GetValue ("items");
    List<Book> books = value.ToObject<List<Book>> ();
    return books;
}

我从这里使用了这段代码: https://gist.github.com/NeilBostrom/cab8b9275e39bb90ecf8e06ab980664b

如何使用apollo将返回的数据保存到本地?

如果您想使用 AppSync/Apollo 和 Xamarin 在移动平台上实现适当的离线缓存,您将需要做很多工作。首先,Apollo 是 Android 和 iOS 的原始缓存 GraphQL 客户端,Amazon AppSync SDK 库基于这些。他们只是在上面构建了一些亚马逊特定的功能。

问题是,尽管 iOS 和 Android 都存在库,但它们不能与 Xamarin 一起使用,需要创建一个单独的绑定项目,以便您可以调用Xamarin 特定 C# 代码中的库。

这是您需要做的:

  1. 创建 Xamarin.iOS 绑定项目以创建 AppSync iOS SDK and follow this article on how to get it to work. There's also quite detailed information on Microsoft Docs 的 C# 绑定,但它针对 Objective-C 代码,因此您需要注意某些差异。
  2. 创建 Xamarin.Android Java 绑定库以创建 AppSync Android SDK. Follow this article Microsoft 文档上的 C# 绑定,以获取有关操作方法的指导。
  3. 现在您可以在 Xamarin.iOS 和 Xamarin.Android 上使用相关库了。如果我没记错的话,AppSync 库会自动将数据缓存在磁盘上,因此您甚至不需要自己做任何事情。无论如何,在这一点上我可以写一篇关于如何实现的三页文章但是如果你到了这一点,最好遵循我链接的 AppSync iOS 和 Android 存储库上的指导和教程以上。

编辑: 如果以上看起来工作量太大,您可以考虑的其他选项:

  • 尝试为 Apollo iOS and Apollo Android 创建绑定并尝试以这种方式实现缓存。无论如何,AppSync SDK 在内部使用它们(如下图所示),因此它们应该适合该任务。 Source

  • 如果您不依赖于 Amazon 平台,还有其他几个 Graph QL 数据库和提供商可能对 Xamarin 有更好的支持。

  • GraphQL 响应是纯粹的 JSON。如果您不需要复杂的增量处理等,您可以尝试自己为它构建一个缓存机制。