2017-03-09 2 views
1

Erstens ist dies kein Duplikat What does this mean? "'NSUnknownKeyException', reason: … this class is not key value coding-compliant for the key X"Diese Klasse ist nicht Schlüsselcodierung-kompatibel für den Schlüssel XXX-Klasse richtig zugeordnet?

ich zu dieser Frage ausgesehen haben und ein paar andere, und haben dafür gesorgt, dass meine Klasse durch die Identität Inspektor sowie der Inspektor-Verbindungen verbunden ist. Meine Klasse erscheint auch im Assistentenmodus im Modus Automatisch.

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") 
     } 
    } 

Eine wichtige Anmerkung ist, dass es 1 und 2 vor dem Senden des Fehlers ausgibt.

Auch hier sind die specfic Fehler, die ich bekomme:

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.' 

so vielen Dank.

+1

'Kind (currentUser.uid) .value (forKey: "teamCount")' abstürzt, weil man davon aus, dass diese 'child' eine' teamCount' Eigenschaft hat und es doesn t. – matt

Antwort

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

Sie können einen Wert von der DB nicht so erhalten. Sie müssen die Referenz beachten, um einen Wert zu erhalten. Aber es scheint, als ob Sie versuchen, einen Wert zu erhöhen, also sollten Sie eine Transaktion verwenden, um das trotzdem zu tun. Wenn du es nicht tust, wenn zwei Benutzer gleichzeitig versuchen, es zu erhöhen, gibt es eine gute Chance, dass die Änderungen den anderen überschreiben (persönlich finde ich es auch lesbarer). Hier ist wie.

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!) 
    } 
} 

So würden Sie normalerweise TeamCount von Ihrer DB laden, ohne die Transaktion.

Ich habe den Code nicht getestet, aber ich denke, es sollte funktionieren.

Links:

Firebase Transactions

+0

War ein kleiner Fehler drin, behoben. –

Verwandte Themen