从firebase数据库读取数据失败

时间:2017-06-29 23:58:14

标签: android firebase firebase-realtime-database

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

enter image description here

以" 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()读取时出错是什么错误?
  3. 我试过用这个:

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

2 个答案:

答案 0 :(得分:1)

我通过引入多个for循环解决了这个问题 所以,我的第一个孩子的快照是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); } } 下面是提取所有值和键的代码:

OnCommand

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

答案 1 :(得分:0)

为什么你使用等于然后获得当前用户。 .child(user.getUid())应该已经是你当前的用户,它会为你提供你想要听的孩子的价值。

我认为uuid是&#34; 8SSOuk .......&#34;的孩子。 所以看起来应该是这样的: 。FirebaseDatabase.getInstance()getReference()子(&#34;位置&#34)。孩子。(&#34; 8SSOuk .......&#34)。子(user.getUid()) ;