如何检查Firebase数据类中是否已存在值Anroid
我想检查Firebase数据库中是否存在总线编号。如何检查Firebase数据类中是否已存在值Anroid
这是我的示例代码。我一直在寻找过去的日子,但我找不到合适的代码来这样做。
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();
}
有人可以帮我解决这个问题吗?提前致谢。 if语句是否正确,我的问题是为什么postRef.addListenerForSingleValueEvent
...不起作用?我试图测试一些吐司消息,但消息不会弹出。
你的做法是错误的。
当你这样做时dataSnapshot.child(busNum).exists()
,它正在关键部分寻找busNum
,你的钥匙是-kasajdh...
。
因此,你可以做的是,让itrable
,现在当你看 data.child(busNum).exists()
它涉及到价值
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
}
}
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
难以猜测问题,因为您没有说明busNum
和busNumber
是如何定义和管理的。是busNumber
一个字符串?
push()
创建对自动生成的子位置的引用。自动生成的密钥看起来像-KPB_cS74yoDaKkM9CNB
。
声明postRef.push().setValue(busNumber)
存储值busNumber
在位置BusNumber/<push-generated-key>
。
声明dataSnapshot.child(busNum).exists()
测试位置BusNumber/<busNum>
处是否存在值。除非busNum
是由push()
创建的密钥之一,否则它不会成立。
目前尚不清楚您希望数据结构如何。如果您的公交车号码是字符串并且是唯一的,则不需要使用push()
生成密钥。你可以使用存储总线号的存在:
postRef.child(busNumber).setValue(true)
而不是获取数据的整个迭代列表,您可以查询准确进入。
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) {
}
});
您是否有任何Firebase规则设置阻止您阅读数据库?也许在onCanceled中添加一个日志,并打印出Firebase错误(如果有的话)。 – Linxy
@linxy是的,我已经做到了。但据我记忆。没有错误 – tin
您是否找到了解决方案? – silverFoxA