2015-10-01 129 views
42

我想从android中的Firebase中获取所有子女名单。如何从Firebase获取所有子女名单android

我已经实现了这个代码,但它不工作。

mFirebaseRef = new Firebase(FIREBASE_URL); 

mFirebaseRef.addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     List<String> td = (ArrayList<String>) dataSnapshot.getValue(); 
     //notifyDataSetChanged(); 
    } 

    @Override 
    public void onCancelled(FirebaseError firebaseError) { 

    } 
}); 
+0

可能重复:http://stackoverflow.com/questions/27848313/firebase-retrieve-child-android下面 –

+1

答案。但这部分是猜测,因为“它不工作”的含义非常模糊,并且不包含您的数据片段。如果我的回答没有解决你的问题:你会得到什么错误?你的数据是什么样子的(复制/粘贴它的样本,没有截图和描述)? –

+0

试试这个:http://stackoverflow.com/questions/32886546/how-to-get-all-child-list-from-firebase-android/36600791#36600791 –

回答

27

火力地堡值存储在此格式的序列:

"-K-Y_Rhyxy9kfzIWw7Jq": "Value 1" 
"-K-Y_RqDV_zbNLPJYnOA": "Value 2" 
"-K-Y_SBoKvx6gAabUPDK": "Value 3" 

如果这是你如何让他们,你所得到的错误类型。上述结构被表示为Map,而不是作为一个List

mFirebaseRef = new Firebase(FIREBASE_URL); 

mFirebaseRef.addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     Map<String, Object> td = (HashMap<String,Object>) dataSnapshot.getValue(); 

     List<Object> values = td.values(); 

     //notifyDataSetChanged(); 
    } 

    @Override 
    public void onCancelled(FirebaseError firebaseError) { 

    } 
}); 
+0

我想要父列表“-K-Y_Rhyxy9kfzIWw7Jq”: “Value 1” “-K-Y_RqDV_zbNLPJYnOA”:“Value 2” “-K-Y_SBoKvx6gAabUPDK”:“Value 3” –

+0

可以使用Map =(HashMap ) dataSnapshot.getValue();'还是必须将Object转换为MyDataObject? –

+0

@Frank,Android工作室在此行上显示红色下划线列表 values = td.values(); ...错误: - 无法将集合对象转换为列表对象..堆栈跟踪中发生错误.. –

64

希望下面的代码工作

Firebase ref = new Firebase(FIREBASE_URL); 

    ref.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot snapshot) { 
      Log.e("Count " ,""+snapshot.getChildrenCount()); 
      for (DataSnapshot postSnapshot: snapshot.getChildren()) { 
      <YourClass> post = postSnapshot.getValue(<YourClass>.class); 
      Log.e("Get Data", post.<YourMethod>()); 
      } 
     } 
     @Override 
     public void onCancelled(FirebaseError firebaseError) { 
      Log.e("The read failed: " ,firebaseError.getMessage()); 
     } 
    }); 
+4

当我打印日志时它是空的。你可以帮帮我吗? –

+0

救了我一天。非常感谢你! –

+0

请问你可以发布数据在树状结构中,我卡在这.. –

4

保存和Retriving数据 - 从火力地堡(不建议使用版本2.4.2)

Firebase fb_parent = new Firebase("YOUR-FIREBASE-URL/"); 
Firebase fb_to_read = fb_parent.child("students/names"); 
Firebase fb_put_child = fb_to_read.push(); // REMEMBER THIS FOR PUSH METHOD 

//INSERT DATA TO STUDENT - NAMES I Use Push Method 
fb_put_child.setValue("Zacharia"); //OR fb_put_child.setValue(YOUR MODEL) 
fb_put_child.setValue("Joseph"); //OR fb_put_child.setValue(YOUR MODEL) 
fb_put_child.setValue("bla blaaa"); //OR fb_put_child.setValue(YOUR MODEL) 

//GET DATA FROM FIREBASE INTO ARRAYLIST 
fb_to_read.addValuesEventListener....{ 
    public void onDataChange(DataSnapshot result){ 
     List<String> lst = new ArrayList<String>(); // Result will be holded Here 
     for(DataSnapshot dsp : result.getChildren()){ 
      lst.add(String.valueOf(dsp.getKey())); //add result into array list 
     } 
     //NOW YOU HAVE ARRAYLIST WHICH HOLD RESULTS 




for(String data:lst){ 
     Toast.make(context,data,Toast.LONG_LENGTH).show; 
     } 
    } 
} 
9

我做了这样的事情:

Firebase ref = new Firebase(FIREBASE_URL); 
ref.addValueEventListener(new ValueEventListener() { 

@Override 
public void onDataChange(DataSnapshot snapshot) { 
    Map<String, Object> objectMap = (HashMap<String, Object>)  
      dataSnapshot.getValue(); 
    List<Match> = new ArrayList<Match>(); 
    for (Object obj : objectMap.values()) { 
     if (obj instanceof Map) { 
      Map<String, Object> mapObj = (Map<String, Object>) obj; 
      Match match = new Match(); 
      match.setSport((String) mapObj.get(Constants.SPORT)); 
      match.setPlayingWith((String) mapObj.get(Constants.PLAYER)); 
      list.add(match); 
     } 
    } 
    } 
    @Override 
    public void onCancelled(FirebaseError firebaseError) { 

    } 
}); 
+0

实际上帮助我,谢谢! – JozeRi

+0

欢迎您@JozeRi :) – ruchita

+1

我的理解对不对?每次即使只添加一个匹配类型值,您也在循环播放? – MeLine

17
FirebaseDatabase mFirebaseDatabase = FirebaseDatabase.getInstance(); 
DatabaseReference databaseReference = mFirebaseDatabase.getReference(FIREBASE_URL); 
     databaseReference.addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 

       for (DataSnapshot childDataSnapshot : dataSnapshot.getChildren()) { 
        Log.v(TAG,""+ childDataSnapshot.getKey()); //displays the key for the node 
        Log.v(TAG,""+ childDataSnapshot.child(--ENTER THE KEY NAME eg. firstname or email etc.--).getValue()); //gives the value for given keyname 
       } 
      } 
     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

希望它有帮助!

3

在我的情况下,只有给定的解决方案工作正常。

火力地堡的ArrayList结构的截图:

enter image description here

如何火力地堡DataSnapshot获取整个列表

GenericTypeIndicator<Map<String, List<Education>>> genericTypeIndicator = new GenericTypeIndicator<Map<String, List<Education>>>() {}; 
Map<String, List<Education>> hashMap = dataSnapshot.getValue(genericTypeIndicator); 

for (Map.Entry<String,List<Education>> entry : hashMap.entrySet()) { 
     List<Education> educations = entry.getValue(); 
     for (Education education: educations){ 
      Log.i(TAG, education.Degree); 
     } 
} 

Education.java:(型号类)。

public class Education implements Serializable{ 

    public String Degree; 
    public String Result; 
} 

希望这可以正常工作。

7

弗兰克说的"key": "Value" 格式值火力地堡商店序列,是a 地图结构

从这个序列,你必须

得到 列表
  1. 初始化GenericTypeIndicator with HashMap of 字符串和您的对象
  2. 得到DataSnapShot的价值GenericTypeIndicator地图
  3. 初始化ArrayListHashMap值。

GenericTypeIndicator<HashMap<String, Object>> objectsGTypeInd = new GenericTypeIndicator<HashMap<String, Object>>() {}; 
Map<String, Object> objectHashMap = dataSnapShot.getValue(objectsGTypeInd); 
ArrayList<Object> objectArrayList = new ArrayList<Object>(objectHashMap.values()); 

正常工作对我来说,希望它能帮助。

0
mDatabase.child("token").addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       for (DataSnapshot snapshot:dataSnapshot.getChildren()) 
       { 
       String key= snapshot.getKey(); 
       String value=snapshot.getValue().toString(); 
       } 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 
       Toast.makeText(ListUser.this,databaseError.toString(),Toast.LENGTH_SHORT).show(); 
      } 
     }); 

唯一的工作。如果孩子没有SubChild

enter image description here

+0

**这是用于单个时间阅读特定的甲酸** –