2016-03-30 4 views
2

Mit Firebase Android docs mit einer Liste von Daten zu speichern:Firebase Wieder login/zusätzliche Anmeldung werden alle Benutzerdaten

String new_status; 
new_status = status_update_text.getText().toString(); 
Firebase postRef = userRef.child("posts"); 
Map<String, String> post1 = new HashMap<String, String>(); 
post1.put("status", new_status); 
postRef.push().setValue(post1); 

Benutzer gespeichert Datenbank nach der Authentifizierung mit:

//save user to database 
Map<String, String> map = new HashMap<String, String>(); 
map.put("provider", authData.getProvider()); 
if(authData.getProviderData().containsKey("displayName")) { 
    map.put("displayName", authData.getProviderData().get("displayName").toString()); 
    } 
    ref.child("users").child(authData.getUid()).setValue(map); 

Sicherheitsregeln zur Zeit:

"rules": { 
    ".read": true, 
     "$posts": { 
     // create new post if it doesn't exist but can't modify or delete posts 
     ".write": "!data.exists() || newData.exists()" 
     } 
} 

Das Problem ist, wenn sich der Benutzer wieder anmeldet, werden alle gespeicherten Daten gelöscht (I assum e) mit .setValue (Karte). Ich habe versucht, die Schreibregel so hoch wie möglich zu setzen, da ich die Regeln heruntersklaviert habe, aber ich verstehe nicht, warum sie gerade ignoriert wird ???

Antwort

0

Ihr Zustand ist falsch:

!data.exists() || newData.exists() 

Sagen Sie, dass Sie die Daten an einen Ort zu schreiben, die bereits Daten enthält. Dies wertet auf:

!true || true => true 

Sie wahrscheinlich bist:

!data.exists() 

Auch die documentation on securing new data vs existing data sehen.

+0

danke für Ihre Eingabe @frankvanpuffelen. Sie haben versucht, wie Sie es vorgeschlagen haben, aber jetzt erlaubt es keine Schreibvorgänge? Der oben aufgeführte Versuch wurde dem Dokumentationslink entnommen, den Sie angegeben haben. Siehe die letzte Überschrift mit dem Titel "Anonymes Chat-Beispiel". Laut den Kommentaren soll Zeile 34 die Erstellung neuer Nachrichten ermöglichen, aber keine Änderung oder Löschung? – JC23

+0

'! Data.exists() && newData.exists()" 'Das Snippet aus dem Dokumentationsbeispiel verwendet' && ', Sie verwenden ein' || ' –

+0

Ich entschuldige mich für das @frankvanpuffelen. Allerdings' ".write" : "! data.exists() && newData.exists()" 'verhinderte beim Testen alle Schreibvorgänge? Ging zurück und testete alle 3 (&&, || und! data.exists()) Versionen, um sicher zu sein; && und ! data.exists() verhindert das Schreiben, während || alles löscht, wenn sich der Benutzer wieder anmeldet. – JC23

0

Wenn ich das Problem richtig lese, liegt das Problem nicht so sehr an Ihren Regeln, sondern eher daran, dass jedes Mal, wenn ein Benutzer seine zuvor gespeicherte Information authentifiziert, gelöscht wird. Wenn das der Fall ist, dann würde ich sagen, das Problem ist, wie Ihr erraten,

ref.child("users").child(authData.getUid()).setValue(map); 

Die setValue() Funktion, um Ihren spezifischen Benutzer Knoten wird und alle anderen Daten zu löschen - nur mit der display ersetzen .

Ich glaube, Sie würden die updateChildren() -Methode setValue() gegen wollen

ref.child("users").child(authData.getUid()).updateChildren(map); 

, die nur den Benutzernamen aktualisieren sollten und die restlichen Daten an Ort und Stelle belassen.

+0

Danke @kyle für die Eingabe. Ich war mir nicht bewusst, dass ich diese Methode für die ersten Logins verwenden könnte, aber es scheint zu funktionieren Löschen Sie den gesamten Benutzerknoten, aber updateChildren überschreibt ihn beim Aufruf in die Datenbank. – JC23

Verwandte Themen