web-dev-qa-db-fra.com

Tableau d'écriture dans Firebase Android

J'essaie d'écrire ceci sur ma Firebase 

Parent

--0: John

--1: Tim

--2: Sam

--3: Ben

Je fais ça

String[] names = {"John","Tim","Sam","Ben"};
myFirebaseRef.setValue(names);

Et ce n’est rien d’écrire.

Cela fonctionne à l'aide de la console Chrome pour Firebase.

N'est-ce pas la façon dont vous écrivez un tableau dans Firebase?

Merci

11
masood elsad

La méthode .setValue() nécessite List plutôt que Array.

Les types natifs acceptés par cette méthode pour la valeur correspondent à les types JSON: Boolean, Long, Double, Map, String, Object, List, Object ...

Firebase ref = new Firebase("<my-firebase-app>/names"):
String[] names = {"John","Tim","Sam","Ben"};
List nameList = new ArrayList<String>(Arrays.asList(names));
// Now set value with new nameList
ref.setValue(nameList);  

Mais, je recommande d’utiliser une Map au lieu d’une List. Plutôt que d'avoir une clé basée sur un index (1, 2, 3, ...), vous pouvez utiliser le nom comme clé pour faciliter la récupération.

Firebase ref = new Firebase("<my-firebase-app>/names"):
HashMap<String, String> names = new HashMap()<String, String>;
names.put("John", "John");
names.put("Tim", "Tim");
names.put("Sam", "Sam");
names.put("Ben", "Ben");
ref.setValue(names);

Et maintenant, si vous voulez récupérer les données, il vous suffit de connaître le nom.

Firebase ref = new Firebase("<my-firebase-app>/names"):
Firebase johnRef = ref.child("john");
johnRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot snapshot) {
       System.out.println(snapshot.value); // the String "John"
    }
    @Override
    public void onCancelled(FirebaseError firebaseError) {

    }
});

Lisez la documentation Firebase pour plus d'informations.

25
David East

Je ne suis pas sûr de Java, mais pour une application Web, vous pouvez utiliser quelque chose comme suit:

Je voulais créer une fonction réutilisable pour ajouter/enregistrer n'importe quel objet sous un nœud racine (même s'il contient un tableau de données à n'importe quel niveau de l'objet) . Alors je suis venu avec cela. (Je ne sais pas si est conforme aux meilleures pratiques, mais cela a fonctionné sans encombre)

    SaveWholeData: function(sKey, oVal, bGenKey) {
        bGenKey = bGenKey === undefined ? true: bGenKey;
        var oOriginalProperty = angular.copy(oVal);
        for (var property in oVal) {
            if (oVal.hasOwnProperty(property) && oVal[property] instanceof Array) {
                console.log(property);
                oVal[property] = "$|$";
            }
        }
        var sOwnRef = SaveDataByKey(sKey, oVal, bGenKey);
        for (var property in oVal) {
            if (oVal.hasOwnProperty(property) && oVal[property] === "$|$") {
                oVal[property] = oOriginalProperty[property];
                var updatedReference = sOwnRef + "/" + property;
               SaveWholeData(updatedReference, oVal[property], false);
            }
        }
        return true;
    },
    SaveDataByKey: function(sKey, oVal, bGenKey) {
        if (bGenKey) {
            var newPostKey = firebase.database().ref(sKey).Push().key;
            oVal.genKey = newPostKey;
            firebase.database().ref(sKey).child(newPostKey).set(oVal);
            return sKey + "/" + newPostKey;
        }else{
            firebase.database().ref(sKey).set(oVal);
            return sKey;
        }
    }

Donc, pour ajouter un nouvel utilisateur sous root users, vous appelez:

SaveWholeData("users", oUserInfo, true);

et pour mettre à jour l'utilisateur existant :

SaveWholeData("users"+"/"+ oUserInfo.genKey, oUserInfo, true);
0
Mahesh