首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android Firebase数据库查询返回null

Android Firebase数据库查询返回null
EN

Stack Overflow用户
提问于 2016-12-03 23:11:52
回答 3查看 1.5K关注 0票数 0

我正在尝试查询Firebase数据库,但一直返回null。下面是数据库的样子:

和Stem对象:

代码语言:javascript
运行
复制
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中的MainActivity

代码语言:javascript
运行
复制
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返回。有什么想法吗?

EN

回答 3

Stack Overflow用户

发布于 2017-02-09 01:59:52

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

票数 2
EN

Stack Overflow用户

发布于 2016-12-04 01:14:29

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

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

代码语言:javascript
运行
复制
{
    "Stems": [
        null,
        { "stem": "Test for stem 1"},
        { "stem": "Test for stem 2"}
    ]
}

您可以阅读有关here阵列的Firebase行为的更多信息

您的问题的解决方案是使用databaseReference.push()方法为新的词干生成密钥。使用push()方法,您不必记住词干的最后一个键就可以将其递增1。Firebase也推荐这种push()方法作为添加新的子项的方法。

push()方法用法示例:

代码语言:javascript
运行
复制
// 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);

希望这能有所帮助:)

编辑:如果你不想改变你的数据库结构

代码语言:javascript
运行
复制
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) {

    }
});
票数 1
EN

Stack Overflow用户

发布于 2018-02-20 08:28:17

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

代码语言:javascript
运行
复制
init(){
...your code...
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40949220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档