【问题标题】:Unable to retrieve data from Firebase Realtime Database无法从 Firebase 实时数据库中检索数据
【发布时间】:2017-06-19 10:33:52
【问题描述】:

如果我给出了零件编号,我正在尝试显示零件的“位置”。 数据结构如下所示:

{
"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 表示部分的子值。

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

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    试试这个

    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()));
    
                }
            });
    

    【讨论】:

    • 试过了,还是没有帮助 DatabaseReference databaseReference=firebaseDatabase.getReference("parts/").child(curP); databaseReference.addChildEventListener(new ChildEventListener() { @Override public void onChildAdded(DataSnapshot dataSnapshot, String s) { Products data=dataSnapshot.getValue(Products.class); tv.setText(data.getLoc()); }
    • 根据提供的信息。我认为答案是有效的。我认为您还有其他问题。
    【解决方案2】:

    问题是您在onChildAdded() 中得到的并不是您期望的整个 Product 对象。

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

    您可以用来获取整个 Product 对象的两种模式是:

    • 将 ChildEventListener 直接添加到“parts”节点,您将获得每个 Products 作为该节点的子节点,或者;
    • 如果您将侦听器直接添加到特定产品的节点,请使用 ValueEventListener,将整个节点条目作为一个 dataSnapshot

    【讨论】:

    • 尝试使用addValueEventListener直接抓取特定产品节点下Products类的对象,还是没有输出
    • 那么看来您的问题可能不止一个,但问题中的信息仅足以让我们发现这一问题。您需要检查其他事项,例如您的安全规则、Product.class 的构造是否正确、dataSnapshot.toString() 是否返回任何内容、控制台中是否有错误消息等。
    【解决方案3】:

    您可以尝试使用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 检索数据的好主意。

    【讨论】:

      猜你喜欢
      • 2019-11-28
      • 2019-11-26
      • 2020-11-30
      • 2019-04-16
      • 2020-12-09
      • 1970-01-01
      • 2018-07-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多