无法使用DynamoDB扫描中的信息

时间:2015-06-26 19:26:35

标签: 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是真实的,因为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 个答案:

答案 0 :(得分:0)

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

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