【问题标题】:Firebase throws Database exception when trying retrieve data into custom class尝试将数据检索到自定义类时,Firebase 引发数据库异常
【发布时间】:2018-04-21 13:15:36
【问题描述】:

尝试从 firebase 检索数据时出现以下错误 com.google.firebase.database.DatabaseException:无法将 java.lang.Long 类型的对象转换为 com.ui.controls.CodeDescMast 类型。

我的 POJO 类包含一个 int 和 string。我已经定义了空构造函数、getter/setter 方法,所有这些都是公共的。

CodeDescMast cdeDescMast = dSnpSht.getValue(CodeDescMast.class) 正在产生数据库异常错误。

问题是我使用同一个类进行保存和检索,为什么会出现这个错误。

我的 POJO 课程

public class CodeDescMast {
int code;
String desc;

public CodeDescMast() { }
public CodeDescMast(int code, String desc) {
    this.code = code;
    this.desc = desc;
}

public int getCode() {
    return code;
}

public void setCode(int code) {
    this.code = code;
}

public String getDesc() {
    return desc;
}

public void setDesc(String desc) {
    this.desc = desc;
}

}

Firebase 助手类

public class FbaseHelper {

DatabaseReference dbRef;
Boolean saved= null; 
CodeDescMast codeDescMast;
ArrayList<CodeDescMast> cdeDescAryList;

public FbaseHelper() { }
public FbaseHelper(DatabaseReference refDb) {
    this.dbRef = refDb;
    cdeDescAryList = new ArrayList<CodeDescMast>() ;
}

public void read(Context context) {

    String csvLine;

    InputStream is=null ;
    try {
        is = context.getAssets().open("b.csv") ;
        BufferedReader reader = new BufferedReader(new InputStreamReader(is)) ;
        codeDescMast = new CodeDescMast();
        while((csvLine = reader.readLine())!=null) {
           String[] row = csvLine.split(",") ;
           if (! row[1].equals("Desc")) {

               codeDescMast.setCode(Integer.valueOf(row[0]));
               codeDescMast.setDesc(row[1]);
               fBaseSave();

           }
        }

        is.close();

    } catch(IOException ioex) {
        ioex.printStackTrace();

    }
}
public Boolean fBaseSave() {
    try {
        dbRef.push().setValue(codeDescMast) ;
        saved = true;

    }catch (DatabaseException dbEx) {
        dbEx.printStackTrace();
        saved = false ;

    }

    return saved;
}

从 Firebase 中检索

  public ChildEventListener chldEvtListner = new ChildEventListener() {
    @Override
    public void onChildAdded(DataSnapshot dataSnapshot, String s) {
        for(DataSnapshot dSnpSht : dataSnapshot.getChildren()) {
            long a = dataSnapshot.getChildrenCount();

            CodeDescMast cdeDescMast = dSnpSht.getValue(CodeDescMast.class) ;

            cdeDescAryList.add(cdeDescMast) ;
        }
    }

来自 Firebase 的 JSON

{
  "-LAXQwrXU01IA5ha5eBW" : {
  "code" : 602,
  "desc" : "xxxxxxxxxxx"
},
 "-LAXQwrezdMRpfVdEVY8" : {
 "code" : 603,
 "desc" : "xxxxxxx"
}
}

【问题讨论】:

  • 您用来获取数据的参考是什么?

标签: android firebase-realtime-database


【解决方案1】:

创建数据库引用

公共 FirebaseDatabase 数据库 = FirebaseDatabase.getInstance();

public DatabaseReference users = database.getReference("Node").child("Your ID or firebase uid reference");

ref.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot dSnpSht: dataSnapshot.getChildren()) 
     {
      CodeDescMast cdeDescMast = dSnpSht.getValue(CodeDescMast.class);             

      }
    }

    @Override
    public void onCancelled(FirebaseError firebaseError) { }
});

/// 试试这个

【讨论】:

  • 我只是在我的 mainactivity.java 中的根目录下添加。我能够查看 dataSnaphot 中的值,因此当我在 datasnapshot 上尝试 getValue 时会发生错误。因此,我想知道为什么会出现此错误而无需更改任何内容。
  • 在我拥有的当前代码中,childadded 正确触发,参数 datasnapshot 也具有适当的值(至少来自 firebase 的第一行。在这种情况下,为什么 datasnopt.getvalue 会产生这个错误。我想了解为什么在更改任何代码之前会抛出此错误消息。
  • ValueEventListener 会在节点改变时触发,但 ChildEventListener 也会在更小的子值改变时触发
  • 在你的情况下,我认为 valueEventListner 更好,因为你正在研究单层架构
猜你喜欢
  • 1970-01-01
  • 2021-08-24
  • 1970-01-01
  • 2020-07-16
  • 2013-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
相关资源
最近更新 更多