web-dev-qa-db-fra.com

Comment puis-je vérifier si une valeur existe déjà dans une classe de données Firebase Android

Je veux vérifier si le numéro de bus existe déjà dans la base de données de Firebase.

Voici mon exemple de code. J'ai cherché ces derniers jours mais je ne trouve pas le bon code pour le faire.

ref = new Firebase(Config.FIREBASE_URL);
            postRef = ref.child("BusNumber");

            busNum = edtBus.getText().toString().trim();
            route1 = route.trim();
            seat = edtSeat.getText().toString().trim();

            if (!busNum.isEmpty() && !route1.isEmpty() && !seat.isEmpty()) {
                postRef.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        if (dataSnapshot.child(busNum).exists()) {
                            edtBus.setError("Bus number already exists.");
                            edtBus.setText("");
                        } else {
                            busNumber = new BusNumber();
                            busNumber.setBusNum(busNum);
                            busNumber.setRoute(route1);
                            busNumber.setNumSeat(seat);
                            postRef.Push().setValue(busNumber);
                            edtBus.setText("");
                            edtSeat.setText("");
                            Toast.makeText(AddBusActivity.this, "Saving successful!", Toast.LENGTH_SHORT).show();
                        }
                    }

                    @Override
                    public void onCancelled(FirebaseError firebaseError) {
                        Toast.makeText(AddBusActivity.this, "Error", Toast.LENGTH_SHORT).show();
                        Toast.makeText(AddBusActivity.this, firebaseError.getMessage(), Toast.LENGTH_SHORT).show();
                    }
                });

            } else {
                Toast.makeText(AddBusActivity.this, "Please complete the information", Toast.LENGTH_SHORT).show();
            }

Quelqu'un peut-il m'aider sur cette question? Merci d'avance. Que l'instruction if soit correcte ou non, mon problème est aussi pourquoi le postRef.addListenerForSingleValueEvent... ne fonctionne pas? J'ai essayé de tester un message toast mais le message ne sortira pas.

here is my firebase database

11
tin

Votre approche est fausse.

Lorsque vous effectuez cette dataSnapshot.child(busNum).exists(), il recherche le busNum dans la section clé, où vos clés sont -kasajdh....

Donc, au lieu de cela, vous pouvez obtenir le iterable, maintenant lorsque vous recherchez data.child(busNum).exists() il se rapporte à la valeur

   postRef.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                for(DataSnapshot data: dataSnapshot.getChildren()){
                    if (data.child(busNum).exists()) {
                        //do ur stuff
                    } else {
                       //do something if not exists
                    }
                  }
                }

                @Override
                public void onCancelled(FirebaseError firebaseError) {

                }
            });
15
silverFoxA

Plutôt que d'obtenir une liste de données entièrement itérable, vous pouvez rechercher une entrée exacte.

  postRef = FirebaseDatabase.getInstance().getReference().child("BusNumber");

    postRef.orderByChild("busNum").equalTo(busNum)
        .addListenerForSingleValueEvent(new ValueEventListener() {

           @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                if(dataSnapshot.exists()){
                   //bus number exists in Database
            } else {
                //bus number doesn't exists.
            }

            @Override
            public void onCancelled(FirebaseError firebaseError) {

            }
        });
7
Vishal Sharma
dataSnapshot.child(busNum).getValue() != null

devrait marcher.

3
Abhi V

Il est difficile de deviner le problème car vous n'indiquez pas comment busNum et busNumber sont définis et gérés. busNumber est-il une chaîne?

Push() crée une référence à un emplacement enfant généré automatiquement. La clé générée automatiquement ressemble à -KPB_cS74yoDaKkM9CNB.

L'instruction postRef.Push().setValue(busNumber) stocke la valeur busNumber à l'emplacement BusNumber/<Push-generated-key>.

L'instruction dataSnapshot.child(busNum).exists() teste l'existence d'une valeur à l'emplacement BusNumber/<busNum>. Ce ne sera vrai que si busNum est l'une des clés créées par Push().

La façon dont vous souhaitez structurer vos données n'est pas claire. Si vos numéros de bus sont des chaînes et sont uniques, vous n'avez pas besoin de générer une clé avec Push(). Vous pouvez enregistrer l'existence de numéros de bus en utilisant:

postRef.child(busNumber).setValue(true)

1
Bob Snyder