Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 无法从Firebase数据库读取数据 代码_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Android 无法从Firebase数据库读取数据 代码

Android 无法从Firebase数据库读取数据 代码,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,正在从onDataChange中的数据库读取数据,但我无法从mShops列表中存储和读取数据。如果能帮助我找出此数据未存储在列表中的原因,我将不胜感激。根据Alex的建议编辑。 这里可以做的是将每个数据从onDataChange()传递到另一个方法并从那里访问它,或者如果您只是计划在日志上打印数据,请尝试移动这一行(不使用final) 要解决此问题,只需将mShops列表的声明移动到onDataChange()中,如下所示: mRef.child("shops").addValueEventLi

正在从onDataChange中的数据库读取数据,但我无法从mShops列表中存储和读取数据。如果能帮助我找出此数据未存储在列表中的原因,我将不胜感激。

根据Alex的建议编辑。

这里可以做的是将每个数据从
onDataChange()
传递到另一个方法并从那里访问它,或者如果您只是计划在日志上打印数据,请尝试移动这一行(不使用final)


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

mRef.child("shops").addValueEventListener(new ValueEventListener() {}
mRef.child(“shops”).addValueEventListener(新的ValueEventListener()){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
List mShops=new ArrayList();
对于(DataSnapshot noteSnapshot:DataSnapshot.getChildren()){
车间数据=noteSnapshot.getValue(Shop.class);
Log.e(“Log”,data.getName()+“”+data.getUrl());
mShops.add(数据);
}
适用于(商店:mShops){
Log.e(“mShops”,shop.getName()+“”+shop.getUrl());
}
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
Log.d(“Log”,databaseError.getMessage());
}
});

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

您是否排除了未使用适配器调用notifyDataSetChanged()的可能性,假设列表中有一个适配器?数据似乎存储在list.side中。注意,对于(Shop:mShops){}操作不是很好的做法,因为操作是异步的,在填充所有项之后,outter for each循环可能会运行,也可能不会运行。在for循环之后,从onDataChange调用一个方法,在for循环中向mShops添加数据。在该方法中,尝试使用mShops打印。那就行了。提供你的firebase数据库模式这是完全错误的。当您使用
final
关键字时,这并不意味着您不能向列表中添加元素,而是意味着编译器确保您只能初始化变量一次。换句话说,您无法将新值重新分配给
mShops
对象。谢谢您提供的信息。但我也经历过同样的情况,如果列表被声明为final,它将永远不会添加一个对象。那么,我能为mShops增值吗?如果是,那么是否有办法确保添加元素?再次感谢。我刚刚有机会了解并澄清我对“final”关键字的疑问+1.
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
List<Shop> mShops = new ArrayList<>();    
mRef.child("shops").addValueEventListener(new ValueEventListener() {}
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());
    }
});