2017-01-17 2 views
0

Wenn ich Firebase (oder irgendeine Datenbank, die Daten basierend auf IDs aggregiert) verwende, muss ich fast immer einen Schlüssel eines gegebenen Wertes verfolgen. Nehmen wir zum Beispiel an, ich habe eine Location-Klasse mit Breiten- und Längenfeldern. Wenn ich von fireBase herunterlade, möchte ich neben den beiden Feldern auch den Schlüssel (Knotenwert, der mit push() erzeugt wurde) z. B. -K_ESEYXNfMBNmgF3fO4) von dem ich heruntergeladen habe, damit ich ihn später aktualisieren, löschen usw. kann nur zwei Lösungen:Wie man Datenbankschlüssel der Firebase verwaltet?

  1. Duplizieren Sie die Daten und fügen Sie den Schlüsselwert als weiteres Feld für die Standortklasse hinzu. Das funktioniert nicht gut, da ich den Schlüsselwert erst nach dem Ausführen von push() setzen muss.

  2. generic-Wrapper-Klasse erstellen, die Schlüssel und Objekt hält:

    public class Key<T> { 
    
        private final String key; 
        private final T value; 
    
        public Key(String key, T value) { 
         this.value = value; 
         this.key = key; 
        } 
    
        public String key() { 
         return key; 
        } 
    
        public T value() { 
         return value; 
        } 
    } 
    

ich den zweiten Ansatz verwenden aber es sieht nicht wirklich schön. Ich habe diese Key-Klasse grundsätzlich in meiner gesamten Codebasis und wenn Sie RxJava verwenden, haben viele Methoden einen Rückgabetyp wie diesen: Observable<Key<Location>> und das sieht einfach lächerlich aus.

+0

Warum nicht Sie die Location-Klasse pushkey in der Location-Klasse speichern? –

Antwort

2

Was Sie lächerlich nennen, sieht eigentlich ganz normal für mich aus.

Alternativ können Sie den Schlüssel in das POJO einfügen und mit @Exclude annotieren, um ihn von der Serialisierung auszuschließen.

0

Folgen auf @FrankvanPuffelen große Antwort auf, tun, was Sie mit dem unten pushkey

Read and Write Data on Android

private void writeNewPost(String userId, String username, String title, String body) { 
    // Create new post at /user-posts/$userid/$postid and at 
    // /posts/$postid simultaneously 
    String key = mDatabase.child("posts").push().getKey(); 
    Post post = new Post(userId, username, title, body); 
    Map<String, Object> postValues = post.toMap(); 

    Map<String, Object> childUpdates = new HashMap<>(); 
    childUpdates.put("/posts/" + key, postValues); 
    childUpdates.put("/user-posts/" + userId + "/" + key, postValues); 

    mDatabase.updateChildren(childUpdates); 
} 
Verwandte Themen