Java 从Firebase中提取数据导致崩溃

Java 从Firebase中提取数据导致崩溃,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我正试图从Firebase获取一些数据。我的Firebase结构如下所示: "groups": { group-key (random key generated by firebase): { "creationDate": "dropbox": "endDate": "evernote": "googleDocs": "members": { "0": user 1

我正试图从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": 
   }
}
我试图用以下代码从
子项中提取所有日期:

private List<DataService> grouplist;

mDatabase = FirebaseDatabase.getInstance();
mDBRef = mDatabase.getReference().child("groups");
grouplist = new ArrayList<>();

@Override
protected 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);
            dataService.setSubject(subject);

            grouplist.add(dataService);

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

        }         
    });
}
但我得到了一个错误:

java.lang.ClassCastException:java.lang.Long不能转换为java.lang.String

我猜问题出在“成员”孩子身上,从那里获得用户。我是否走对了方向/出了什么问题,还是有更好的方法?谢谢你的帮助

试着用这种方法

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()
value方法如下

String creationDate=dataSnapshot.child(“creationDate”).getValue().toString();
//将土地价值转换为字符串价值,而不是转换为字符串类对象

您还需要将
字符串成员
更改为
列表成员
,并更改其数据类型列表的setter和getter方法

记住:我假设User是一个包含用户数据的类。如果它是一个简单的字符串,那么您可以使用字符串而不是用户

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

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

问题在于,您的模型类中有一组类型字符串
creationDate
,而数据库中的
creationDate
包含一个
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
,您试图将其转换为
String
,因此请尝试查找位置或使用
String.valueOf()
,例如:
String.valueOf(dataSnapshot.child(“creationDate”).getValue()
请添加单个
组键
对象的屏幕截图,以便更清楚地查看属性。请使用@进行响应。我在@AlexMamoIf I add.toString()上方添加了一个屏幕截图。如果我收到以下错误消息:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“java.lang.String java.lang.Object.toString()”。谢谢。这解决了问题
String creationDate = (String) dataSnapshot.child("creationDate").getValue();
long creationDate = dataSnapshot.child("creationDate").getValue(Long.class);