Android 从简单的FireBase数据库读取
我在读取Firebase数据库时遇到一些问题 我有一个非常简单的布局Android 从简单的FireBase数据库读取,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我在读取Firebase数据库时遇到一些问题 我有一个非常简单的布局 { "lot" : { "lot1" : "low", "lot2" : "low", "lot3" : "low" } } 当然,MyAppName{}是最重要的 FirebaseDatabase database = FirebaseDatabase.getInstance(); DatabaseReference myRef = database.getInstance(
{
"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},但是我希望能够得到一个数组,如果可能的话,每个数组都有一个值
这是可以实现的吗 您的代码中有一些调整。你的
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getInstance().getReference();
应该这样写,
DatabaseReference myRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference database = myRef.child("anyValueNameYouSpecifyInConsole");
这两行应该在onCreate方法之外声明。需要使用addValueEventListener指定的是第二个数据库引用,而不是第一个。从我的例子来看应该是这样的
database.addValueEventListener (new ValueEventListener)
它将导入方法
如果您希望数据显示在特定的TextView中,那么只需找到要使用的TextView并将其包含在onDataChange方法中,如下所示
String x = dataSnapshot.getValue(String.class);
textViewNameDeclared.setText(x);
不要忘记更改读取的安全规则。您可以使用typecast来
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表达式。我有同样的问题,这就是我使用的。修改以适应此处的问题
private List<String> lotList;
lotList = new ArrayList<>();
DatabaseReference reference= database.getInstance().getReference().child("lot");
私有列表lotList;
lotList=newarraylist();
DatabaseReference=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) {
}
});
reference.addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
Iterable mData=dataSnapshot.getChildren();
对于(数据快照d:mData){
字符串lot\u String=d.getValue(String.class);
lotList.add(lot\U字符串);
}
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
谢谢!我要试一试!