gpt4 book ai didi

ios - 无法使用 DynamoDB 扫描中的信息

转载 作者:行者123 更新时间:2023-11-30 14:16:41 25 4
gpt4 key购买 nike

我正在使用 swift 在 iOS 应用程序中构建注册/登录系统。我设置了一个 DynamoDB 表,我可以从该表发送和加载数据。但是,当我尝试扫描表格时遇到了问题。我正在使用扫描来检查并确保电子邮件、用户名和密码是原始的。扫描功能可以正常工作并记录所有数据,但是当我尝试使用数据时,就像我说的那样:

let results = task.result as! AWSDynamoDBPaginatedOutput

for r in results.items{

if (self.emailTextField.text == r.userEmail){

self.emailMessageLabel.hidden = false
self.emailTextField.text = nil

}

整个函数变得困惑。因为它的作用是检查 emailTextField 是否等于任何结果,即使只有一次,其他所有时间都不是。因此,它会说 emailMessageLabel.hidden 为 true 的次数与 emailTextField 不等于任何内容的次数一样多,并且只有一次为 false 的次数。所以本质上答案既是对的又是错的,我不能使用这些数据。我该如何解决?我已经尝试修复它好几天了。我将附上我一直尝试使用的所有代码。

扫描功能

func verifyAndActivateAccount(expression : AWSDynamoDBScanExpression) {
self.emailMessageLabel.hidden = true
self.nameMessageLabel.hidden = true
self.passwordMessageLabel.hidden = true
let tableRow = DDBTableRow()
let dynamoDBObjectMapper = AWSDynamoDBObjectMapper.defaultDynamoDBObjectMapper()

dynamoDBObjectMapper.scan(DDBTableRow.self, expression: expression) .continueWithExecutor(BFExecutor.mainThreadExecutor(),
withBlock: { (task:BFTask!) -> AnyObject! in
if (task.error == nil) {
let results = task.result as! AWSDynamoDBPaginatedOutput

for r in results.items{

if (self.emailTextField.text == r.userEmail){

self.emailMessageLabel.hidden = false


}
if (self.nameTextField.text == r.UserID) {

self.nameMessageLabel.hidden = false


}
if (self.passwordTextField.text == r.userPassword){

self.passwordMessageLabel.hidden = false


}



}



}else{

self.giveSignUpAlert("Scan didn't work.")

}

return nil

})

}

按钮被按下

@IBAction func storeRegisterInfo(sender: UIButton) {
let exp = AWSDynamoDBScanExpression()
self.verifyAndActivateAccount(exp)
//Check for original info
let tableRow = DDBTableRow()
tableRow?.UserID = self.nameTextField.text
tableRow?.userEmail = self.emailTextField.text
tableRow?.userPassword = self.passwordTextField.text

let userEmail = emailTextField.text
let userName = nameTextField.text
let userPassword = passwordTextField.text
let userConfirm = confirmTextField.text



if userPassword != userConfirm {

giveSignUpAlert("Your Passwords Don't Match!")

}
if (self.passwordTextField.text == self.confirmTextField.text) {
if (userEmail.isEmpty || userName.isEmpty || userPassword.isEmpty || userConfirm.isEmpty){

giveSignUpAlert("All Field Are Required")

}else{

self.insertDataIntoTable(tableRow)

}

}


}

最佳答案

您可以使用以下几种方法:

  1. 使用用户标识符的抽象概念作为用户表的哈希键。每当您创建新用户时,首先添加一个以新用户的电子邮件地址键入的项目,并带有用户名属性。接下来,添加一个以新用户的用户名键入的项目,其中保存了整个用户配置文件。由于用户名和电子邮件地址都是此表中的哈希键,因此对电子邮件地址 PutItem 和用户名 PutItem 调用使用 ConditionExpression=attribute_not_exists(user_identifier) 进行条件写入足以保证旧记录不被覆盖。此方法在电子邮件项写入和用户名项写入之间不太可能出现竞争条件。此方法还需要对用户名进行限制 - 用户名不能包含@标记或以其他方式看起来像电子邮件地址。
  2. 拥有以用户名为关键字的基表,以及以电子邮件地址为关键字的投影所有属性的 GSI。当新用户注册时,在 GSI 上对输入给定电子邮件地址的用户执行查询,并确保没有用户使用该电子邮件,然后使用 PutItem 上表的 attribute_not_exists(username) 确保用户名是唯一的。
  3. 在您的 USERS 表上启用 view=NEW_IMAGE 的 DynamoDB 流,并将 Lambda 函数附加到该流,该函数将新用户的电子邮件地址写入不同的表 EMAILS。要添加用户,请首先在 EMAILS 表上 GetItem 以确保电子邮件不存在,然后在 USERS 表上使用 attribute_not_exists 条件 PutItem。

关于ios - 无法使用 DynamoDB 扫描中的信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31080742/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com