You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:29:52