从简单的FireBase数据库中读取

时间:2017-06-27 00:04:14

标签: android firebase firebase-realtime-database

我在使用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},但是我希望能够得到一个数组,如果可能的话,每个值。

这可以实现吗?

3 个答案:

答案 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表达式。