Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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数据库查询返回null_Android_Firebase - Fatal编程技术网

Android Firebase数据库查询返回null

Android Firebase数据库查询返回null,android,firebase,Android,Firebase,我试图查询Firebase数据库,但始终返回null。以下是数据库的外观: 而Stem对象: public class Stem { private String stem; public Stem(){} public Stem(String stem){ this.stem = stem; } public String getText(){ return stem; } public void

我试图查询Firebase数据库,但始终返回null。以下是数据库的外观:

而Stem对象:

public class Stem {
    private String stem;

    public Stem(){}

    public Stem(String stem){
        this.stem = stem;
    }

    public String getText(){
        return stem;
    }

    public void setText(String stem){
        this.stem = stem;
    }
}
以及OnCreate中的主要活动

mFirebaseDatabase = FirebaseDatabase.getInstance();
mStemDatabaseReference = mFirebaseDatabase.getReference().child("Stems");

 getStemButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

if (mChildEventListener == null) {
                    mChildEventListener = new ChildEventListener() {
                        @Override
                        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                            Stem stem = dataSnapshot.getValue(Stem.class);
                            mStemAdapter.add(stem);
                        }

                        @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) {

                        }
                    };
                    mStemDatabaseReference.addChildEventListener(mChildEventListener);
                }

            }
        });

查询似乎可以很好地访问数据库,因为它返回Stems json数组,但当它尝试将stem添加到适配器时,它将stem返回为null。有什么想法吗?

看起来数据库中
词干下的值被识别为数组而不是对象。这是因为茎的键是递增的数字

您可以尝试从Firebase数据库控制台导出JSON,并查看数据库的结构。您将获得的值应如下所示:

{
    "Stems": [
        null,
        { "stem": "Test for stem 1"},
        { "stem": "Test for stem 2"}
    ]
}
您可以阅读有关Firebase阵列行为的更多信息

您的问题的解决方案是使用
databaseReference.push()
方法为新阀杆生成键。使用
push()
方法,无需记住阀杆的最后一个键即可将其递增1。Firebase还建议将此
push()
方法作为添加新子项的方法

push()
方法用法示例:

// create new Stem object
Stem stem = new Stem("Test for new stem");
// push new key under 'Stems' and then set the Stem object as value under the new key
mStemDatabaseReference.push().setValue(stem);
希望这有帮助:)

编辑:如果不想更改数据库结构

mStemDatabaseReference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        GenericTypeIndicator<List<Stem>> genericTypeIndicator = new GenericTypeIndicator<List<Stem>>() {};
        List<Stem> stemList = dataSnapshot.getValue(genericTypeIndicator);
        for (Stem stem : stemList) {
            if (stem != null) {
                mStemAdapter.add(stem);
            }
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});
mStemDatabaseReference.addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
GenericTypeIndicator GenericTypeIndicator=新的GenericTypeIndicator(){};
List stemList=dataSnapshot.getValue(genericTypeIndicator);
用于(阀杆:阀杆列表){
如果(阀杆!=null){
mStemAdapter.add(茎);
}
}
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});

看起来数据库中
词干下的值被识别为数组而不是对象。这是因为茎的键是递增的数字

您可以尝试从Firebase数据库控制台导出JSON,并查看数据库的结构。您将获得的值应如下所示:

{
    "Stems": [
        null,
        { "stem": "Test for stem 1"},
        { "stem": "Test for stem 2"}
    ]
}
您可以阅读有关Firebase阵列行为的更多信息

您的问题的解决方案是使用
databaseReference.push()
方法为新阀杆生成键。使用
push()
方法,无需记住阀杆的最后一个键即可将其递增1。Firebase还建议将此
push()
方法作为添加新子项的方法

push()
方法用法示例:

// create new Stem object
Stem stem = new Stem("Test for new stem");
// push new key under 'Stems' and then set the Stem object as value under the new key
mStemDatabaseReference.push().setValue(stem);
希望这有帮助:)

编辑:如果不想更改数据库结构

mStemDatabaseReference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        GenericTypeIndicator<List<Stem>> genericTypeIndicator = new GenericTypeIndicator<List<Stem>>() {};
        List<Stem> stemList = dataSnapshot.getValue(genericTypeIndicator);
        for (Stem stem : stemList) {
            if (stem != null) {
                mStemAdapter.add(stem);
            }
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});
mStemDatabaseReference.addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
GenericTypeIndicator GenericTypeIndicator=新的GenericTypeIndicator(){};
List stemList=dataSnapshot.getValue(genericTypeIndicator);
用于(阀杆:阀杆列表){
如果(阀杆!=null){
mStemAdapter.add(茎);
}
}
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});

这是因为Firebase使用异步调用来访问数据库。由于没有用于此的OnComplete侦听器,您应该通知您的适配器列表中的更改。当我面对这个问题时,我正在使用RecyclerView,只是在适配器上调用了
notifyDataSetChanged
,用获取的值更新它。

这是由于Firebase使用异步调用访问您的数据库。由于没有用于此的OnComplete侦听器,您应该通知您的适配器列表中的更改。当我面对这个问题时,我正在使用RecyclerView,只是在适配器上调用了
notifyDataSetChanged
,用获取的值更新它。

尝试将Firebase查询移动到活动加载中稍后的某个点。我在通过Intent传递值时遇到了类似的问题,但在Intent执行之前,数据没有及时从Firebase返回并加载到变量中。也许您应该创建一个初始化函数,并在“创建”对话框的底部调用它

init(){
...your code...
}

尝试将Firebase查询移动到稍后活动加载中的某个点。我在通过Intent传递值时遇到了类似的问题,但在Intent执行之前,数据没有及时从Firebase返回并加载到变量中。也许您应该创建一个初始化函数,并在“创建”对话框的底部调用它

init(){
...your code...
}

单击此处,无论哪种方式,它都不会返回Stem对象,可能stemadapter不会通知更改。使用system.out.Print打印stem对象,以确保它不为空。它发生在stem适配器之前。我认为这与它如何从数据库中读取数据并试图从中创建Stem对象有关您的
DatabaseReference
必须从根指定完整路径。
pbandmath febfc
是您的项目根目录吗?如果没有,请更正引用以包括从根到
茎的所有路径段。此外,您的
Stem
POJO没有遵循所需的命名约定。对于字段
stem
来说,getter/setter必须命名为
getStem()
settem()
。在此处单击“无用”,无论哪种方式,它都不会返回stem对象,可能stemadapter不会通知更改。使用system.out.Print打印stem对象,以确保它不为空。它发生在stem适配器之前。我认为这与它如何从数据库中读取数据并试图从中创建Stem对象有关您的
DatabaseReference
必须从根指定完整路径。
pbandmath febfc
是您的项目根目录吗?如果没有,请更正引用以包括从根到
茎的所有路径段