2017-03-09 145 views
1

首先,这不是What does this mean? "'NSUnknownKeyException', reason: … this class is not key value coding-compliant for the key X"该类不是密钥值编码兼容的密钥XXX - 类正确确认?

我已经看过这个问题和一些其他人,并已确保我的课是通过身份检查以及连接检查连接的重复。我的课程也通过助理编辑器中的自动模式显示出来。

if let currentUser = FIRAuth.auth()?.currentUser { 

     ref = FIRDatabase.database().reference() 
     ref.child("Teams").child(self.teamName.text!).setValue(["Name" : self.teamName.text!]) 
     ref.child("Teams").child(self.teamName.text!).setValue(["Number" : self.teamNumber.text!]) 
     ref.child("Teams").child(self.teamName.text!).setValue(["Password" : self.teamPassword.text!]) 
     ref.child("Teams").child(self.teamName.text!).setValue(["memberCount" : 1]) 
     print("1") 

     let userName = "member" + String(1) 
     let currentUserEmail = currentUser.uid 
     ref.child("Teams").child(self.teamName.text!).child("memberList").setValue([userName : currentUserEmail]) 
     print("2") 

     if let userteamcount = self.ref.child("Users").child(currentUser.uid).value(forKey: "teamCount") as? Int { 
      let currentTeam = "team" + String(userteamcount + 1) 
      print("4") 
      self.ref.child("Users").child(currentUser.uid).setValue(["teamCount" : (userteamcount + 1)]) 
      print("5") 
      self.ref.child("Users").child(currentUser.uid).child("joinedTeams").setValue([currentTeam : self.teamNumber.text!]) 
      print("6") 
     } 
    } 

一个重要的注意事项是它在发送错误之前打印出1和2。

而且,这里的specfic错误,我得到:

1 
2 
Terminating app due to uncaught exception 'NSUnknownKeyException', reason: 
'[<FIRDatabaseReference 0x618000054160> valueForUndefinedKey:]: 
this class is not key value coding-compliant for the key teamCount.' 

非常感谢。

+1

'子(currentUser.uid).value的(forKey: “teamCount”)'崩溃,因为你是假设这'child'有一个'teamCount'性质和它doesn “T。 – matt

回答

2
self.ref.child("Users").child(currentUser.uid).value(forKey: "teamCount") as? Int 

你不能像这样从数据库中获得一个值。你需要观察参考才能得到一个值。但似乎你正在尝试增加一个值,所以你应该使用一个事务来做到这一点。因为如果你不这样做,当两个用户同时尝试增加它时,很有可能一个人的改变会覆盖另一个人(我个人认为它也更易读)。就是这样。

self.ref.child("Users").child(currentUser.uid).child("teamCount").runTransactionBlock({ (currentData: FIRMutableData) -> FIRTransactionResult in 
    var teamCount = currentData.value as? Int 
    if teamCount != nil { 
    currentData.value = teamCount + 1 
    } 
    return FIRTransactionResult.success(withValue: currentData) 
}) { (error, committed, snapshot) in 
    if error == nil { 
     // Update joinedTeams here 
     let value = snapshot.value as? Int 
     let currentTeam = "team\(value)" 
     self.ref.child("Users").child(currentUser.uid).child("joinedTeams").child(currentTeam).setValue(self.teamNumber.text!) 
    } 
} 

以下是您如何从数据库中正常加载teamCount,而无需事务。

self.ref.child("Users").child(currentUser.uid).child("teamCount").observeSingleEvent(.value, with: { dataSnapshot in 
    let teamCount = dataSnapshot.value as? Int 
}) 

我还没有测试代码,但我认为它应该工作。

链接:

Firebase Transactions

+0

在那里是一个小错误,修复它。 –

相关问题