为了账号安全,请及时绑定邮箱和手机立即绑定

从 Firebase 拉取数据导致崩溃

从 Firebase 拉取数据导致崩溃

慕标琳琳 2021-08-25 17:26:08
我正在尝试从 Firebase 获取一些数据。我的 Firebase 结构如下:"groups": {   group-key (random key generated by firebase): {      "creationDate":       "dropbox":       "endDate":       "evernote":       "googleDocs":       "members": {               "0": user 1               "1": user 2                "2": user 3 etc....      }     "projectName":      "subject":    }}我正在尝试groups使用以下代码从孩子那里拉下所有日期:private List<DataService> grouplist;mDatabase = FirebaseDatabase.getInstance();mDBRef = mDatabase.getReference().child("groups");grouplist = new ArrayList<>();@Overrideprotected void onStart() {    super.onStart();grouplist.clear();        mDBRef.addChildEventListener(new ChildEventListener() {        @Override        public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {            String creationDate = (String) dataSnapshot.child("creationDate").getValue();            String dropbox = (String) dataSnapshot.child("dropbox").getValue();            String endDate = (String) dataSnapshot.child("endDate").getValue();            String evernote = (String) dataSnapshot.child("evernote").getValue();            String googleDocs = (String) dataSnapshot.child("googleDocs").getValue();            String members = (String) dataSnapshot.child("members").getValue();            String projectName = (String) dataSnapshot.child("projectName").getValue();            String subject = (String) dataSnapshot.child("subject").getValue();            DataService dataService = new DataService();            dataService.setCreationDate(creationDate);            dataService.setDropbox(dropbox);            dataService.setEndDate(endDate);            dataService.setEvernote(evernote);            dataService.setGoogleDocs(googleDocs);            dataService.setmembers(members);            dataService.setProjectName(projectName);        }             });}但我收到此错误:java.lang.ClassCastException: java.lang.Long 不能转换为 java.lang.String我的猜测是问题出在“成员”子级并从那里获取用户。我是在正确的轨道上/出了什么问题还是有更好的方法来做到这一点?感谢所有帮助。
查看完整描述

3 回答

?
ITMISS

TA贡献1871条经验 获得超8个赞

问题是您在模型类creationDate中creationDate拥有String 类型的集合,而在数据库中则拥有long. 要解决此问题,请在您的模型类中将您的属性类型从 更改String为long:


public long creationDate;

并且请将相应的 setter 和 getter 更改为:


public long getCreationDate() {

    return creationDate;

}


public void setCreationDate(long creationDate) {

    this.creationDate = creationDate;

}

构造函数也应该像这样改变:


public DataService(String subject, String projectName, String endDate, String members, long creationDate, String dropbox, String evernote, String googleDocs) {

    this.subject = subject;

    this.projectName = projectName;

    this.endDate = endDate;

    this.members = members;

    this.creationDate = creationDate;

    this.dropbox = dropbox;

    this.evernote = evernote;

    this.googleDocs = googleDocs;

}

最后,只需更改以下代码行:


String creationDate = (String) dataSnapshot.child("creationDate").getValue();


long creationDate = dataSnapshot.child("creationDate").getValue(Long.class);


查看完整回答
反对 回复 2021-08-25
?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

尝试使用这种方式


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

            DataService creationDate = dataSnapshot.getValue(DataService.class);

            grouplist.add(dataService);

            Log.d(TAG, String.valueOf(grouplist));

        }  

您正面临错误,因为您正试图将值对象强制转换为字符串类。所以你使用上面陈述的代码你只需你可以toString()用每个getValue()值方法调用该方法作为


String creationDate = dataSnapshot.child("creationDate").getValue().toString();

//convert land value to String value not into the String class object


您还需要更改String member为List<User> member并更改其数据类型 List 的 setter 和 getter 方法的另一件事。


请记住:我假设 User 是一个包含用户数据的类。如果它是一个简单的 String 那么你可以使用 String 而不是 User


查看完整回答
反对 回复 2021-08-25
?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

而不是这个


        String creationDate = (String) dataSnapshot.child("creationDate").getValue();

        String dropbox = (String) dataSnapshot.child("dropbox").getValue();

        String endDate = (String) dataSnapshot.child("endDate").getValue();

        String evernote = (String) dataSnapshot.child("evernote").getValue();

        String googleDocs = (String) dataSnapshot.child("googleDocs").getValue();

        String members = (String) dataSnapshot.child("members").getValue();

        String projectName = (String) dataSnapshot.child("projectName").getValue();

        String subject = (String) dataSnapshot.child("subject").getValue();

像这样做


        String creationDate = dataSnapshot.child("creationDate").getValue().toString();

        String dropbox = dataSnapshot.child("dropbox").getValue().toString();

        String endDate = dataSnapshot.child("endDate").getValue().toString();

        String evernote = dataSnapshot.child("evernote").getValue().toString();

        String googleDocs = dataSnapshot.child("googleDocs").getValue().toString();

        String members = dataSnapshot.child("members").getValue().toString();

        String projectName = dataSnapshot.child("projectName").getValue().toString();

        String subject = dataSnapshot.child("subject").getValue().toString();

toString() 用于将任何值转换为字符串。您不能像正在做的那样将任何内容转换为字符串。


另外,这段代码


        DataService dataService = new DataService();

        dataService.setCreationDate(creationDate);

        dataService.setDropbox(dropbox);

        dataService.setEndDate(endDate);

        dataService.setEvernote(evernote);

        dataService.setGoogleDocs(googleDocs);

        dataService.setmembers(members);

        dataService.setProjectName(projectName);

        dataService.setSubject(subject);

        grouplist.add(dataService);

可以用这个代替


        DataService dataService = new DataService(subject, projectName, endDate, members, creationDate, dropbox, evernote, googleDocs);

        grouplist.add(dataService);

或这个,


        grouplist.add(new DataService(subject, projectName, endDate, members, creationDate, dropbox, evernote, googleDocs));

因为您已经为此类创建了构造函数。


查看完整回答
反对 回复 2021-08-25
  • 3 回答
  • 0 关注
  • 183 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信