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.
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) {
}
});
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) {
}
});
dataSnapshot.child(busNum).getValue() != null
devrait marcher.
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)