无法从Firebase数据库中读取数据

时间:2017-10-03 05:51:23

标签: android firebase firebase-realtime-database

CODE

final List<Shop> mShops = new ArrayList<>();
mRef.child("shops").addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot noteSnapshot: dataSnapshot.getChildren()){
            Shop data = noteSnapshot.getValue(Shop.class);
            Log.e("log", data.getName()+" "+data.getUrl());
            Shops.add(data);
         }
     }

     @Override
     public void onCancelled(DatabaseError databaseError) {
         Log.d("LOG", databaseError.getMessage());
     }
});
for (Shop shop : mShops) {
    Log.e("mShops", shop.getName()+" "+shop.getUrl());
}

LOG

E/log: Levi's https://firebasestorage.googleapis.com/v0/b/fir-87605.appspot.com/o/storefront27.jpg?alt=media&token=4ea27811-4e06-4bf5-8b96-44a583040088
E/log: Dunkin Donuts https://firebasestorage.googleapis.com/v0/b/fir-87605.appspot.com/o/dunkin.jpg?alt=media&token=f63c6d5f-b074-47ae-a8ca-6f7974ddbd47
E/log: Pizza Parlor https://firebasestorage.googleapis.com/v0/b/fir-87605.appspot.com/o/download.jpg?alt=media&token=1eb9a9bb-495d-416b-9a84-3699214149b9
E/log: Town Bakers https://firebasestorage.googleapis.com/v0/b/fir-87605.appspot.com/o/download%20(1).jpg?alt=media&token=01b16918-272f-4a9f-9607-61f559d30360

正在从onDataChange中的数据库中读取数据,但我无法从mShops列表中存储和读取数据。如果找不到此数据未存储在列表中的原因,我将不胜感激。< / p>

2 个答案:

答案 0 :(得分:2)

要解决此问题,只需将mShops列表的声明移到onDataChange()内,如下所示:

mRef.child("shops").addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        List<Shop> mShops = new ArrayList<>();

        for (DataSnapshot noteSnapshot: dataSnapshot.getChildren()){
            Shop data = noteSnapshot.getValue(Shop.class);
            Log.e("log", data.getName()+" "+data.getUrl());
            mShops.add(data);
         }

         for (Shop shop : mShops) {
             Log.e("mShops", shop.getName()+" "+shop.getUrl());
         }
     }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        Log.d("LOG", databaseError.getMessage());
    }
});

注意,使用此代码,您的ArrayList不需要是最终版。请记住,onDataChange()方法具有异步行为,这意味着甚至在您尝试将类Shop的对象添加到列表之前就会调用它。

答案 1 :(得分:0)

在Alex的建议

之后编辑

您可以在此处执行的操作是将-i ''中的每个数据传递到另一个方法并从那里访问它,或者如果您只是计划在日志中打印数据,请尝试移动此行(不是最终的)< / p>

onDataChange()

在这个

里面
List<Shop> mShops = new ArrayList<>();