Swift 4中AWS DynamoDB UpdateItem实现遇阻,求助解决方案
在Swift里搞定DynamoDB条目更新的方法
我懂这种感觉——AWS Swift SDK早期文档确实不太全,能创建条目却卡在上更新,太闹心了!我帮你整理两种实用的更新方案,适配不同的代码场景:
方案一:用Object Persistence(和你创建条目的路子一致,推荐)
如果你创建条目时用的是AWSDynamoDBObjectMapper,那更新直接沿用这套逻辑就行,不用换思路。核心是先找到要更新的对象,改完属性再存回去,DynamoDB会自动判断是新增还是更新:
// 先拿到默认的ObjectMapper实例 let objectMapper = AWSDynamoDBObjectMapper.default() // 第一步:通过主键(比如你的UserID)查询要更新的用户 let queryExpr = AWSDynamoDBQueryExpression() queryExpr.keyConditionExpression = "UserID = :userId" queryExpr.expressionAttributeValues = [":userId": self.UserID] objectMapper.query(Users.self, expression: queryExpr).continueWith { task in if let err = task.error { print("查用户出错:\(err.localizedDescription)") return nil } guard let userList = task.result?.items as? [Users], let targetUser = userList.first else { print("没找到要更新的用户哦") return nil } // 第二步:修改你要更新的属性,比如公司名称 targetUser._campany = self.CompanyTextBox.text! // 还能加其他要改的属性,比如targetUser._nickname = "新昵称" // 第三步:保存更新,DynamoDB会自动处理更新操作 objectMapper.save(targetUser).continueWith { saveTask in if let saveErr = saveTask.error { print("更新失败:\(saveErr.localizedDescription)") } else { print("用户信息更新成功啦!") } return nil } return nil }
方案二:直接用低层级UpdateItem API(更高效,适合只改部分属性)
要是不想先查再改,直接用底层API指定要更新的字段就行,省掉查询步骤,效率更高:
let dynamoDB = AWSDynamoDB.default() // 构建更新请求 let updateReq = AWSDynamoDBUpdateItemRequest() updateReq?.tableName = "你的DynamoDB表名" // 记得换成你自己的表名 // 必须指定主键,DynamoDB靠这个找要更新的条目 updateReq?.key = ["UserID": AWSDynamoDBAttributeValue(s: self.UserID)] // 设置更新表达式:这里用占位符避免属性名是保留字的问题 updateReq?.updateExpression = "SET #comp = :compVal" updateReq?.expressionAttributeNames = ["#comp": "_campany"] updateReq?.expressionAttributeValues = [":compVal": AWSDynamoDBAttributeValue(s: self.CompanyTextBox.text!)] // 发起更新请求 dynamoDB.updateItem(updateReq!).continueWith { task in if let err = task.error { print("更新出错:\(err.localizedDescription)") } else { print("更新成功!") } return nil }
几个要注意的点
- 你的
Users模型类得正确实现DynamoDB的映射,比如要继承AWSDynamoDBObjectModel和AWSDynamoDBModeling,还要用hashKeyAttribute()指定主键字段 - 如果需要加更新条件(比如只有当用户状态是活跃时才更新),可以给请求加
conditionExpression - 处理异步回调的时候,要是要更新UI,记得切回主线程,比如用
DispatchQueue.main.async包裹UI操作
内容的提问来源于stack exchange,提问作者Rolthar
相关产品推荐
相关产品推荐

