【问题标题】:Reading data from firebase database fails从 firebase 数据库读取数据失败
【发布时间】:2017-06-29 23:58:14
【问题描述】:

我正在从 firebase 数据库中读取数据。以下是存储在数据库中的数据的快照。

在以“8SS...”开头的快照字符串中是用户的uid。以下是从 firebase 数据库中检索数据的代码。

//To check if uid of current user and database user matches.
Query q = FirebaseDatabase.getInstance().getReference().child("Location").child(user.getUid()).equalTo(FirebaseAuth.getInstance().getCurrentUser().getUid());
q.addListenerForSingleValueEvent(
        new ValueEventListener() {
             @Override
             public void onDataChange(DataSnapshot dataSnapshot) {
                     for(DataSnapshot singleSnapshot : dataSnapshot.getChildren()){
                            Log.d(TAG, "Yay!!");
                            User us = singleSnapshot.getValue(User.class);
                            String string = "Name: "+ us.getName()+"\nAddress: "+ us.getlat()+ us.getlon()+ "\n\n";
                            n.setText(string);
                   }
                }

             @Override
             public void onCancelled(DatabaseError databaseError) {
                        // read query is cancelled.
                        Log.d(TAG, "loadPost:onCancelled", databaseError.toException());
                    }
             });

用户类包含 getter 和 setter。
错误是只有empty Text View appears 结束reading from database fails。

  1. 如何评估query is true or false?
  2. 从 ValueEventListener() 读取时出现什么错误?

我试过用这个:

DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("Location").child("8SS0uk4FmiPUtXP208Tx8Cqxt2z2");

然后调用ref.addListenerForSingleValueEvent(),但仍然没有显示任何内容。

我试过用这个:

DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("Location").child(user.getUid());

这给出了dataSnapShot : "DataSnapshot={key='-Kn...', value="latitude:.., longitude:..., Name:..."}。但这不是我所期望的。
数据库结构应该是Location --> Uid --> Name : "Jane", ..。

这是我在数据库中插入数据的代码。

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser() ;
refDatabase = FirebaseDatabase.getInstance().getReference().child("Location").child(user.getUid());
DatabaseReference newPost = refDatabase.push();
//the push() command is already creating unique key
Map<String, String> mapname = new HashMap<String, String>();
mapname.put("Name", n.getText().toString());
mapname.put("latitude", Double.toString(lat));
mapname.put("longitude", Double.toString(longt));
mapname.put("user id", user.getUid());
newPost.setValue(mapname);

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    我通过引入多个 for 循环解决了这个问题。
    所以,我第一个孩子的快照是dataSnapShot : "DataSnapshot={key='-Kn...', value="latitude:.., longitude:..., Name:..."}。
    下面是提取所有值和键的代码:

    mRef.addValueEventListener(
                new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        Log.d(TAG, "Children" + dataSnapshot.getKey());
                        for(DataSnapshot singleSnapshot : dataSnapshot.getChildren()){
                            String st = singleSnapshot.getKey();
                            Log.d(TAG, "Yay!!" + singleSnapshot.child(st));
                            st = "";
                            int count=0;
                            for(DataSnapshot singleSnap : singleSnapshot.getChildren()) {
                                Log.d(TAG, "String" + singleSnap.getValue());
                                //n.setText(us.getName());
                                if(count==0) {
                                    st = "Name: " + singleSnap.getValue() + '\n';
                                }
                                else if(count==1) {
                                    st = st + "Latitude: " + singleSnap.getValue() + '\n';
                                }
                                else if(count==2) {
                                    st = st + "Longitude: " + singleSnap.getValue() + '\n';
                                }
                                count++;
                            }
                            final TextView rowTextView = new TextView(Menu5.this.getActivity());
                            rowTextView.setText((CharSequence) st);
                            ll.addView(rowTextView);
                        }
                    }
    

    这为 push 创建的每个唯一 id 提供了单个键和值对。因此,我必须对连接和显示进行硬编码,因为结构将在整个应用程序中保持不变。

    【讨论】:

      【解决方案2】:

      你为什么使用等于然后获取当前用户。 .child(user.getUid()) 应该已经是您当前的用户,这为您提供了您尝试收听的孩子的价值。

      我认为 uuid 是“8SSOuk.......”的子代。 所以它应该看起来像这样: FirebaseDatabase.getInstance().getReference().child("Location").child("8SSOuk.......").child(user.getUid());

      【讨论】:

      • 不,我在 Firebase 的身份验证中与 uid 进行了交叉检查“8SSOuk ....”是用户的 uid,“-Knp...”是数据推送到数据库。
      猜你喜欢
      • 2018-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-10
      • 2020-01-16
      • 1970-01-01
      相关资源
      最近更新 更多