如何检查Firebase中是否已存在值?

时间:2018-10-02 03:19:44

标签: java android firebase firebase-realtime-database

这是我的数据在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);
    }
}

任何帮助将不胜感激。

2 个答案:

答案 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) {

            }
        });