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

标签 ios xcode swift amazon-dynamodb

我正在使用 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/

相关文章:

ios - @noescape、@escaping 和@autoclosure 之间有什么区别?

android - 哪些数据库/数据存储支持 iOS 和 Android 的客户端数据同步?

ios - 如何获取所有已安装路由应用程序的列表?

ios - 在 Swift 中, future 的新 API 是否会被 App Store 上现有应用程序中的用户定义方法覆盖?

ios - 操作无法完成。 ( cocoa 错误 -1。) - PHPhotoLibrary

swift - 使用按钮从 uicollectionviewCell 中删除单核心数据项

ios - UiTextView 更改字体大小不起作用

arrays - 在 Swift 中创建数组

ios - 从 iOS SDK 使用 Apple Pay

objective-c - iOS 版 WordPress 未编译