【问题标题】:aws appsync offline : getting error Variable id was not providedaws appsync 离线:收到错误未提供变量 ID
【发布时间】:2024-04-19 15:20:01
【问题描述】:

我正在使用 AWS AppSync 进行离线/在线功能的移动开发 (iOS)

我正在尝试以离线模式保存数据。但我收到错误“未提供变量 id/缺少值”

当应用上线时,它会自动同步到 DynamoDB,但问题只是在离线模式下无法获取已保存的记录

这是应用程序中使用的代码

`

    let userObjInput = userObjectInput(id: "id", firstName: "firstname", lastName: "lastName")

    let CategoryInputs = CreateUserCategoryInput(categoryName: "categoryValue" , user: userObjInput)

    let mutation =  CategoryMutation(input: CategoryInputs)

    appSyncClient?.perform(mutation: mutation, queue: .main, optimisticUpdate: { (transaction) in

            do {
                let selectionSets = try transaction?.read(query: query)
                try transaction?.update(query: GetUserCategoriesOfUserQuery(id: "id")) { (data: inout GetUserCategoriesOfUserQuery.Data) in
                  data.getAllCategoriesForUser?.append(GetUserCategoriesOfUserQuery.Data.GetAllCategoriesForUser?.init(GetUserCategoriesOfUserQuery.Data.GetAllCategoriesForUser.init(id: (UUID().uuidString), categoryName: CategoryInputs.categoryName!, isDeleted: false, user: GetUserCategoriesOfUserQuery.Data.GetAllCategoriesForUser.User?.init(GetUserCategoriesOfUserQuery.Data.GetAllCategoriesForUser.User.init(id: userObjInput.id!, firstName: userObjInput.firstName!, lastName: userObjInput.lastName!)))))
            } catch {
                print(error.localizedDescription)
           }
    }, conflictResolutionBlock: nil, resultHandler: { (result, error) in

        if error == nil {
            fetchCategories()

        } else {
            print(error?.localizedDescription)
        }
    })`

【问题讨论】:

  • 你是如何初始化你的 appsync 配置的?您是否使用“id”作为缓存键?示例应用程序中提到的乐观写法:github.com/aws-samples/aws-mobile-appsync-events-starter-ios/… 是否适合您?您可以为您的用例遵循类似的模式吗?
  • 我遵循相同的模式并使用 id 作为缓存。 aws sdk 的问题是,如果我们在 get 查询中使用参数,它将无法获取记录。我发布了问题和示例以支持 2 个月前。他们仍在调查这个问题。
  • 您找到解决方案了吗?我想我也有同样的问题。
  • AWS 支持没有响应。我正在获取所有记录并应用过滤器
  • 这个错误已经在 iOS AppSync SDK 2.6.22的新版本中修复了

标签: swift offline aws-appsync


【解决方案1】:

对于那些对optimistic UI missing value 有问题的人。我发现了一种技巧,可以通过使用客户端应用程序中的Custom Request Header 传递参数来临时解决问题。
之前,您的查询看起来像这样allDiaries(author: String): [Diary]
只需将其更改为 => allDiaries: [Diary]
所以您的request mapping 如下所示:

{
    "version" : "2017-02-28",
    "operation" : "Scan",
    "filter" : {
        "expression" : "author = :author",
        "expressionValues" : {
            ":author" : { "S" : "$context.request.headers.author" }
        }
    }
}

参考:How to pass AWS AppSync custom request header in iOS client?
希望有用!祝你好运:)

【讨论】: