我在使用Firebase数据库时遇到了一些问题。
我有一个非常简单的布局
{
"lot" : {
"lot1" : "low",
"lot2" : "low",
"lot3" : "low"
}
}
当然,MyAppName {}高于这一切。
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getInstance().getReference();
// Read from the database
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
// This method is called once with the initial value and again
// whenever data at this location is updated.
lotMap = (HashMap) dataSnapshot.getValue();
Log.d("[Directions Activity]: ", "Lot1 value ====== " +lotMap.get("lot"));
Iterator it = lotMap.entrySet().iterator();
while (it.hasNext()) {
Map.Entry pair = (Map.Entry)it.next();
Log.d("[Directions Activity]: ", "iterator " + pair.getKey() + " = " + pair.getValue());
System.out.println();
it.remove(); // avoids a ConcurrentModificationException
}
}
以下是从日志
返回的内容 D/[Directions Activity]:: Lot1 value ====== null //null obviously
//because key lot1 doesn't exist
D/[Directions Activity]:: lot = {lot3=low, lot2=low, lot1=low}
所以对我来说,看起来它正在返回字符串{lot3 = low,lot2 = low,lot1 = low},但是我希望能够得到一个数组,如果可能的话,每个值。
这可以实现吗?
答案 0 :(得分:2)
我有同样的问题,这就是我所使用的。修改以适合此处的问题
private List<String> lotList;
lotList = new ArrayList<>();
DatabaseReference reference= database.getInstance().getReference().child("lot");
现在添加价值事件监听器
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Iterable<DataSnapshot> mData = dataSnapshot.getChildren();
for(DataSnapshot d : mData){
String lot_string = d.getValue(String.class);
lotList.add(lot_string);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
答案 1 :(得分:1)
您的代码中有一些调整。你的
discovery
应该这样写,
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getInstance().getReference();
这两行应该在onCreate方法之外声明。您需要使用addValueEventListener指定的是第二个DatabaseReference,而不是第一个。所以,从我的例子中看起来应该是这样的,
DatabaseReference myRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference database = myRef.child("anyValueNameYouSpecifyInConsole");
它将导入方法。
如果您希望数据显示在特定的TextView中,那么只需查看您想要使用的TextView,并将其包含在onDataChange方法中,就像这样,
database.addValueEventListener (new ValueEventListener)
不要忘记更改阅读的安全规则。
答案 2 :(得分:0)
您可以使用类型转换为JSONObject
并解析JSONObject
JSONObject jsonObject= new JSONObject((Map)dataSnapshot.getValue());
JSONObject jsonObj= (JSONObject) jsonObject.get("lot");
for (Object key : jsonObj.keySet()) {
//based on you key types
String keyStr = (String)key;
Object keyvalue = jsonObj.get(keyStr);
//Print key and value
System.out.println("key: "+ keyStr + " value: " + keyvalue);
}
如果使用java 8而不是使用lamada表达式。