2015-06-26 53 views
0

我正在使用swift在iOS应用程序中构建注册/登录系统。我设置了一个DynamoDB表,我可以从该表发送和加载数据。但是,当我尝试扫描表时遇到了问题。我正在使用扫描来检查并确保电子邮件,用户名和密码是原创的。扫描功能的工作原理,并把所有的数据了,但是当我尝试使用,当我说像数据:无法使用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不等于任何值的次数一样多,并且假设它是一次。所以基本上答案是真的和假的,我不能使用这些数据。我该如何解决?我一直在努力修复它几天。我会附上我一直在尝试使用的所有代码。

扫描功能

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) 

     } 

    } 


} 
+0

定义原文。你的意思是说,不同用户之间不能重复使用电子邮件和用户名和密码?这可能会或可能没有意义。一个人可能希望在同一个电子邮件地址上创建多个用户。两个或两个以上的人很可能会选择相同的密码,所以为什么要求密码是唯一的?一旦发现重叠的电子邮件或用户名,您是否需要跳出分页扫描? –

+0

是的,我想使它成为每个用户名和电子邮件从未被使用过的,但我愿意让密码成为非原创性的。我不知道你的意思是打破我的分页扫描。 – JFDeveloper

回答

0

有几个方法,你可以使用:

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

我可以查询该表并获取UserID的空值,但出于某种原因,我无法按照您的建议执行attribute_not_exists条件。当我打印一个查询的结果时,我把一个不存在的用户名打印出来“[]”我试图说如果results.items = nil然后做一些事情,但这是行不通的。有什么建议么? – JFDeveloper