Как запросить все данные в FireBase в режиме реального времени? - PullRequest
1 голос
/ 20 октября 2019

Я хочу сравнить текст с данными из firebase. Ниже мой код, и он читает имя только из ing01. но на самом деле я хочу, чтобы он считывал данные всех ингредиентов, а не только ing01. Пожалуйста, помогите мне, спасибо.

database screenshot

               final String dataCompare=sb.toString();//.replaceAll("\\s+","");



                databaseReference = firebaseDatabase.getInstance().getReference().child("ingredients");//.child("ing01").child("iName");

                databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                        for (DataSnapshot ds: dataSnapshot.getChildren()){

                            String iName = ds.child("iName").getValue(String.class);

                            if(dataCompare.equals(iName)){

                                mResultEt.setText(dataCompare);
                                mStatusEt.setText("OK");
                                mStatusEt.setTextColor(Color.GREEN);
                            }
                            else{
                                mResultEt.setText(dataCompare);
                                mStatusEt.setText("Not OK");
                                mStatusEt.setTextColor(Color.RED);
                            }
                        }

Ответы [ 4 ]

0 голосов
/ 20 октября 2019

Проверьте это:

FirebaseDatabase.getInstance().getReference().child("ingredients").addListenerForSingleValueEvent(
        new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot childSnapshot : dataSnapshot.getChildren()) {
                   String iName = childSnapshot.child("iName").getValue(String.class);

                   //Implement your logic here
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
            }
        }
);

Здесь вы получите все ingredients и через итерацию вы получите iName.

Но в соответствии с вашей логикой реализации. Получить все ингредиенты бесполезно, скорее вы можете получить конкретный ингредиент, соответствующий вашему запросу compare. Попробуйте как показано ниже:

FirebaseDatabase.getInstance().getReference().child("ingredients").orderByChild("iName").equalTo(dataCompare).addListenerForSingleValueEvent(
        new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if(dataSnapshot.hasChildren()) {
                    mResultEt.setText(dataCompare);
                    mStatusEt.setText("OK");
                    mStatusEt.setTextColor(Color.GREEN);
                } else {
                    mResultEt.setText(dataCompare);
                    mStatusEt.setText("Not OK");
                    mStatusEt.setTextColor(Color.RED);
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
            }
        }
);
0 голосов
/ 20 октября 2019

вы можете использовать стороннюю библиотеку, например: Angularfire, вот официальная ссылка: https://github.com/angular/angularfire

0 голосов
/ 20 октября 2019
final String dataCompare=sb.toString();
databaseReference = firebaseDatabase.getInstance().getReference().child("ingredients");

databaseReference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

        String iName1 = dataSnapshot.child("ing01").child("iName");

        String iName2 = dataSnapshot.child("ing02").child("iName");

        //now here you can compare both the iName values with the dataCompare object.
    }
}

**** РЕДАКТИРОВАТЬ ****

final String dataCompare=sb.toString();
Log.d("DataCompare: ", dataCompare);

databaseReference = firebaseDatabase.getInstance().getReference().child("ingredients");

databaseReference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

        if (dataSnapshot.getChildren() == null) {
            Log.d(TAG, "onDataChange: snapshot has no children");

        } else {
            int i = 1;
            for(DataSnapshot ds : dataSnapshot.getChildren()) {
                String iName = ds.child("ing0" + i++).child("iName").getValue();

                // if this doesn't work try this -- 
                // String iName = ds.child("iName").getValue();

                Log.d(TAG, "name value: " + iName);
                if (iName.equals(dataCompare)) {
                    Log.d(TAG, "onDataChange: string equals");

                } else {
                    Log.d(TAG, "onDataChange: strings are not equal");
                }
            }
        }
    }
}

Внутри метода onDataChange() я написал: -

String iName = ds.child("ing0" + i++).child("iName").getValue();

здесьмы читаем дочерний «ing01» (в первой итерации цикла) datasnapshot, который в данный момент находится в «ингридиентах», а затем читаем «iName» и его значение в iName строковый объект.

для каждого цикла будет делать это для всех потомков dataSnapshot, что означает для всех данных, которые у вас есть в вашей базе данных firebase.

0 голосов
/ 20 октября 2019

Вместо firebaseDatabase.getInstance().getReference().child("ingredients").child("ing01").child("iName"); используйте firebaseDatabase.getInstance().getReference().child("ingredients"); для получения всех ингредиентов

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