2015-06-26 52 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