这是我的数据在Firebase数据库中的结构:
qrcode
|- Result
|--"sit19da39a3ee5e6b4b0d3255bfef95601890afd80"
|-- "sit1901-10-2018asd"
JSON格式就像
{
"Result" : {
"-LNEU_XD7EqNBJUoGBxL" : "sit19da39a3ee5e6b4b0d3255bfef95601890afd80709",
"-LNieDTKW6UaVyd_jRWn" : "sit1901-10-2018asd"
}
}
基本上,我正在制作一个可以扫描QR码并将其数据存储在Firebase中的android应用。我这样做的方式是,不会使用substring方法将非以sit19开头的代码推送到数据库中。现在,我想检查新扫描的代码是否已经存在于firebase中。我试过在for循环中使用.haschild(code),但它不能完全正常工作。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
if (result != null) {
if (result.getContents() == null) {
Toast.makeText(this, "You cancelled the scanning", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(this, result.getContents(), Toast.LENGTH_LONG).show();
output = result.getContents();
String TestString = output;
if(output.substring(0,5).equals("sit19") == false) {
// display invalid code
Toast.makeText(this, "Invalid", Toast.LENGTH_LONG).show();
} else {
//push to firebase
DatabaseReference testRef = FirebaseDatabase.getInstance().getReference().child("Result");
//loop through table to see if output is already inside
testRef.push().setValue(TestString);
}
}
} else {
super.onActivityResult(requestCode, resultCode, data);
}
}
任何帮助将不胜感激。
答案 0 :(得分:0)
您可以尝试使用valueEventListener()
和dataSnapshot.exists()
进行尝试。我的意思是,您可以在子节点上放置适当的DatabaseReference
,然后为其设置valueEventListener()
。
在代码中可能看起来像这样:
final DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference().child("qrcode");
databaseReference.orderByChild("Result").equalTo(code).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if(dataSnapshot.exists())
Toast.makeText(Main3Activity.this, "Code exists", Toast.LENGTH_SHORT).show();
else
writeNewCode(code);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
code
可能是您要在结果节点中查找的代码。
答案 1 :(得分:0)
基于此文档 https://firebase.google.com/docs/reference/js/firebase.database.DataSnapshot
存在
exists()返回布尔值
如果此DataSnapshot包含任何数据,则返回true。与使用snapshot.val()!== null相比,效率更高。
有孩子
hasChild(path)返回布尔值
如果指定的子路径具有(非空)数据,则返回true。
private DatabaseReference dbReference = FirebaseDatabase.getInstance().getReference();
DatabaseReference reciverDatabase = dbReference.child(BuildConfig.ARG_CHAT_ROOMS).child(currentUser).child(recervier.getId()).getRef();
dbReference.child(BuildConfig.ARG_CHAT_ROOMS).child(currentUser).child(recervier.getId())
.getRef().addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
reciverDatabase.child(Constants.MESSAGE).removeValue();
if (dataSnapshot.hasChildren()) {
// your code
reciverDatabase.child(Constants.CONVERSATION_UNREAD_COUNT).setValue(0);
reciverDatabase.child(Constants.CONVERSATION_LAST_MESSAGE).setValue("");
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});