当前位置: 首页 > 知识库问答 >
问题:

无法从Firebase实时数据库检索数据

斜昊空
2023-03-14

我试图显示一个零件的"loc",如果它的零件号我给。以下是数据结构的样子:

{
"parts":{
  "14521845": { "name":"TOOL EC160B/EC180B/EC210B/EC240", "loc":"EXC1", "sloc":"B3EGU01C03"},
  "12829050": { "name":"SWITCH; IGNITION SWITCH", "loc":"PS01", "sloc":"85-06-013"},
  "12829050": { "name":"SWITCH; IGNITION SWITCH", "loc":"COM1", "sloc":"B3RGK03D06"},
  "20044893": { "name":"PARTS CATALOG_ENG_SPA_FRE_GER_KOR_EC210D", "loc":"EXC1", "sloc":"B3EGT01B02"}
}
}

活动代码:

FirebaseDatabase firebaseDatabase=FirebaseDatabase.getInstance();
DatabaseReference databaseReference =firebaseDatabase.getReference("parts/"+curP);

            databaseReference.addChildEventListener(new ChildEventListener() {

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

                    Products data=dataSnapshot.getValue(Products.class);
                    Log.i("",String.valueOf(data.getLoc()));

                }

getLoc是Product类的getter函数,它返回给定curP对应的“loc”。curP部分表示子值。

逻辑对我来说似乎是正确的,但我没有得到输出。我哪里出了问题?

共有3个答案

太叔乐家
2023-03-14

您可以尝试使用ValueEventListener。如果希望一次读取数据,请使用addListenerForSingleValueEvent方法,如下所示:

private void getFirebaseLocValue(int curP) {
    FirebaseDatabase firebase = FirebaseDatabase.getInstance();
    DatabaseReference mDatabase = firebase.getReference("parts");

    mDatabase.child(Integer.toString(curP))
        .addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if(dataSnapshot.hasChildren()) {
                Products data = dataSnapshot.getValue(Products.class);
                Log.e("TAG", data.getLoc());
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

或者,您可以使用addValueEventListener,并将通过任何更改获取数据。我真的不认为ChildEventListener是从Firebase检索数据的好主意。

韦宏扬
2023-03-14

问题在于,您在onchildaded()中得到的并不像您期望的那样是一个完整的产品对象。

在数据库引用中,您的目标是特定的产品(“parts/”curP),但使用的是ChildEventListener。特定产品节点的子节点是namelocsloc,因此onchildaded()将多次触发,将这些属性分别作为dataSnapshot提供给您。

获取整个Products对象可能使用的两种模式是:

  • 将ChildEventListener直接添加到部件节点,您将获得每个产品作为该节点的子节点,或者;
  • 如果您直接向特定产品的节点添加侦听器,请使用ValueEventListener,将该节点的整个条目作为一个dataSnapshot获取。
漆雕唯
2023-03-14

试试这个

getReference("parts").child(curP).addChildEventListener(new ChildEventListener() {

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

                Products data = dataSnapshot.getValue(Products.class);
                Log.i("", String.valueOf(data.getLoc()));

            }
        });
 类似资料:
  • firebase数据库最近的更新似乎有一些变化。我的项目在firebase\u数据库:^7.0.0版本下运行良好,但在firebase数据库的更新版本中,我无法更新项目代码。 以下是v7的工作版本 firebase\u数据库^9.0.12上的同一代码出现错误。我收到的错误在`(DataSnapShot snap)async{…}上错误是 无法将参数类型“Future Function(DataSn

  • 我是Android开发的新手,我正在从firebase Realtime数据库中检索所有的子节点,这些节点的约会状态为“已完成”,并且子节点具有当前用户id,但当我移到历史记录时,它没有显示任何内容。有人能帮我解决这个问题吗。我需要尽快解决问题。 Firebase数据库模型

  • 问题内容: 我目前正在学习Firebase和iOS的知识,因此请耐心等待。我当前正在发布到我的表,如下所示: 我正在尝试检索插入新记录时创建的内容,但是无法检索它。我已经尝试过( 但是由于浏览网页而无法找到一个可靠的解决方案,所以这是一个随机的猜测 )。有任何想法吗? 问题答案: 注意 :-Althogh 是自以来的一项强大功能,但是当您想创建具有唯一键的节点时更喜欢将数据存储到其中。我之所以喜欢

  • 我对Firebase和Android是新手。我已经在我的Firebase帐户中存储了用户身份验证详细信息(姓名、个人资料图像而不是电子邮件ID)。我想检索那些数据(如姓名等)到我的应用程序的其他部分。如何检索实时数据库子值?

  • 在身份验证成功时,我正在编写以下代码: