当前位置: 首页 > 面试题库 >

Firebase / Android:将从Firebase检索到的值添加到arraylist返回空指针异常

孟修竹
2023-03-14
问题内容

我正在尝试从Firebase数据库中将检索到的值添加到Arraylist,再从那里添加到String数组。我的检索方法工作正常。我可以将所有值打印在烤面包上。但是显然它不会被添加到arraylist中。

这是我的代码,用于在片段类的onActivityCreated()中进行检索。

ArrayList<String> allBrands = new ArrayList<>();
brandRef=FirebaseDatabase.getInstance().getReferenceFromUrl("https://stockmanager-142503.firebaseio.com/Brands");
        q=brandRef.orderByChild("brandName");
        q.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
               allBrands.add((dataSnapshot.getValue(Brand.class)).getBrandName());
                Toast.makeText(getActivity(),(dataSnapshot.getValue(Brand.class)).getBrandName(), Toast.LENGTH_SHORT).show();

            }

            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s) {

            }

            @Override
            public void onChildRemoved(DataSnapshot dataSnapshot) {

            }

            @Override
            public void onChildMoved(DataSnapshot dataSnapshot, String s) {

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

这就是我试图在Fragment类的OnActivityResult()方法中使用arrayList的地方,但是我认为不会执行迭代器循环。没有看到烤面包。当我尝试使用数组时,出现了空指针异常。我假设这些值不会复制到brands数组中。

count=allBrands.size();
                                String[] brands=new String[count];
                                Iterator<String> itemIterator = allBrands.iterator();
                                if(itemIterator.hasNext()){
                                    //brands[i] = itemIterator.next();
                                    Toast.makeText(getActivity(), itemIterator.next(), Toast.LENGTH_SHORT).show();
                                   // i++;

                                }
                               for( i=0;i<count;i++){
                                    if(brands[i].compareTo(Brand)==0){
                                        f=1;break;
                                    }
                                }

这是我的数据库,以防万一。但是我可以毫无问题地将所有检索到的值打印在Toast中。

Database


问题答案:

从共享的代码中很难确定,因为我怀疑您可能会从Firebase异步加载所有数据的事实中感到困惑。另外,您可能根本无权读取数据。我会给两个答案。

数据异步加载

将一些日志语句添加到最小代码段中时,最容易理解此行为:

System.out.println("Before attaching listener");
q.addChildEventListener(new ChildEventListener() {
    public void onChildAdded(DataSnapshot dataSnapshot, String s) {
        System.out.println("In onChildAdded");    
    }
    public void onChildChanged(DataSnapshot dataSnapshot, String s) { }
    public void onChildRemoved(DataSnapshot dataSnapshot) { }
    public void onChildMoved(DataSnapshot dataSnapshot, String s) { }
    public void onCancelled(DatabaseError databaseError) { }
});
System.out.println("After attaching listener");

该代码段的输出将是:

附加监听器之前

附加监听器后

在onChildAdded中(可能多次)

这可能不是您期望输出的顺序。这是因为Firebase(与大多数云API一样)异步地从数据库加载数据:它不等待数据返回,而是继续在主线程中运行代码,并且然后ChildEventListener.onChildAdded在数据可用时回叫您。

无法在Android上等待数据。如果这样做,您的用户将得到令人生畏的“应用程序无响应”对话框,并且您的应用程序将
被杀死。

因此,处理此API异步特性的唯一方法是将需要具有新数据的代码放入onChildAdded()回调中(并
可能在某些时候也放入其他回调中):

q.addChildEventListener(new ChildEventListener() {
    public void onChildAdded(DataSnapshot dataSnapshot, String s) {
        allBrands.add((dataSnapshot.getValue(Brand.class)).getBrandName());  
        System.out.println(allBrands.length); 
    }

您需要获得读取数据的权限

您需要权限才能从某个位置读取数据。如果您没有权限,Firebase将立即取消监听器。您需要
在代码中处理这种情况,否则您将一无所知。

public void onCancelled(DatabaseError databaseError) {
    throw databaseError.toException();
}


 类似资料:
  • 问题内容: 检索数据有效,但是我无法将检索到的数据保存到ArrayList中。在“ onDataChanged()”方法之后,ArrayList“配置文件”似乎具有2个值,但在return语句中它具有0个值。 问题答案: 您现在无法返回尚未加载的内容。换句话说,您不能简单地在方法之外返回列表,因为它总是由于该方法的异步行为而引起的。这意味着,当您尝试返回该方法之外的结果时,数据尚未完成从数据库的加

  • 首先,我对firebase数据库很陌生。我正在研究如何从firebase检索当前的UID(即当前登录的UID),并将其与一个值一起插入到firebase的child中。 我正在尝试将我当前的UID和它的值推送到Firebase。我很难把它推到火力点。下面是我的firebase结构: 试用后,我仍然无法获得以下代码来检索UID。我对以及这一行遇到了麻烦。 下面是我的构造函数:

  • 函数setUpMapIfNeeded()中的getFragmentManager返回。我把我的片段与activity_main.xml分开,这里是我的代码: activity_main.xml: fragment_main.xml: 这是我的*.Java文件: 我已尝试将getSupportFramentManager与Android.support.v4.app.DialogFragment支持

  • web.xml 应用程序-servlet.xml context.xml(在tomcat conf文件夹中) 谢谢你的建议和帮助。

  • 我对Firebase真的是个新手。我正在做一个使用firestore作为数据库的Android应用程序。我的问题是当我试图检查某个数据是否存在时。它总是说它没有。 这就是发生这种情况的方法。 如您所见,我在这里检查了可以从firestore检索的数据: 这就是我对Utilizadores的定义。

  • 问题内容: 我正在法国学习,所以很难找到法语教程来解决我的问题。因此,我不得不问我的问题,希望有一个令人满意的解决方案。 我的问题是我在firebase上读取数据时遇到了麻烦,并且花了三天时间。 我有这样的结构: 我已经开始编写一些代码,可以恢复密钥,但是无法恢复这些值“ nom”,“ argent”等。 问题答案: John的替代方法是使用来获取每个属性: