2017-06-29 74 views
0

我正在读取firebase数据库中的数据。以下是存储在数据库中的数据的快照。从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()); 
        } 
      }); 

用户类别包含获取者和设置者。
错误是,只有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); 

回答

0

我通过引入多个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.So创建的每个唯一的ID单一键值对,我只好硬编码的级联和显示器作为结构在整个应用程序中保持不变。

0

为什么你使用等于,然后获取当前用户。 .child(user.getUid())应该已经是你当前的用户,它给你你试图聆听的孩子的价值。

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

+0

不,我在firebase认证中使用uid进行了交叉检查“8SSOuk ....”是用户的uid,“-Knp ...”是将数据推送到数据库时生成的id。 – SupposeXYZ