Как я могу проверить, существует ли уже значение в firebase? - PullRequest
0 голосов
/ 02 октября 2018

Вот как мои данные структурированы в базе данных Firebase:

qrcode
|- Result
    |--"sit19da39a3ee5e6b4b0d3255bfef95601890afd80"
    |-- "sit1901-10-2018asd"

В формате JSON это похоже на

{
    "Result" : {
        "-LNEU_XD7EqNBJUoGBxL" : "sit19da39a3ee5e6b4b0d3255bfef95601890afd80709",
        "-LNieDTKW6UaVyd_jRWn" : "sit1901-10-2018asd"
    }
}

По сути, я делаю приложение для Android, которое может сканировать QR-кодыи хранить их данные в базе данных.Я сделал это так, что коды, которые не начинаются с sit19, не будут помещены в базу данных с использованием метода substring.Теперь я хочу проверить, существует ли недавно отсканированный код внутри firebase.Я пытался использовать .haschild (код) в цикле for, но это не совсем работает.

@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 голосов
/ 02 октября 2018

На основании этих документов https://firebase.google.com/docs/reference/js/firebase.database.DataSnapshot

существует

exist () возвращает логическое значение

Возвращает true, если этоDataSnapshot содержит любые данные.Это немного более эффективно, чем использование snapshot.val ()! == null.

hasChild

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

            }
        });
0 голосов
/ 02 октября 2018

Вы можете попробовать что-то с 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 может быть кодом, который вы пытаетесь найти в вашем узле результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...