如何实时查询Firebase中的所有数据?

问题描述 投票:0回答:4

我想将文本与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);
                            }
                        }
android firebase firebase-realtime-database
4个回答
0
投票

代替firebaseDatabase.getInstance().getReference().child("ingredients").child("ing01").child("iName");,使用firebaseDatabase.getInstance().getReference().child("ingredients");获取所有成分


0
投票

您可以使用第三方库,例如:Angularfire,这里有官方链接:https://github.com/angular/angularfire


0
投票

检查此:

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
投票
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.
    }
}

**** EDIT ****

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”(在循环的第一次迭代中),然后将“ iName”及其值读取到iName字符串对象中。

对于每个循环,它将对dataSnapshot的所有子代执行此操作,这意味着将对Firebase数据库中的所有数据执行此操作。

© www.soinside.com 2019 - 2024. All rights reserved.