Выгрузка данных из Firebase, приводящая к сбою - PullRequest
0 голосов
/ 02 сентября 2018

Я пытаюсь получить некоторые данные из 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<>();

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

        }         
    });
}

И мой DataSerivice.java

public class DataService {
public String subject;
public String projectName;
public String endDate;
public String members;
public String creationDate;
public String dropbox;
public String evernote;
public String googleDocs;

public DataService() {
}

public DataService(String subject, String projectName, String endDate, String members, String 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;
}

public String getCreationDate() {
    return creationDate;
}

public void setCreationDate(String creationDate) {
    this.creationDate = creationDate;
}

public String getDropbox() {
    return dropbox;
}

public void setDropbox(String dropbox) {
    this.dropbox = dropbox;
}

public String getEvernote() {
    return evernote;
}

public void setEvernote(String evernote) {
    this.evernote = evernote;
}

public String getGoogleDocs() {
    return googleDocs;
}

public void setGoogleDocs(String googleDocs) {
    this.googleDocs = googleDocs;
}

public String getSubject() {
    return subject;
}

public void setSubject(String subject) {
    this.subject = subject;
}

public String getProjectName() {
    return projectName;
}

public void setProjectName(String projectName) {
    this.projectName = projectName;
}

public String getEndDate() {
    return endDate;
}

public void setEndDate(String endDate) {
    this.endDate = endDate;
}

public String getmembers() {
    return members;
}

public void setmembers(String members) {
    this.members = members;
}

}

Но я получаю эту ошибку:

java.lang.ClassCastException: java.lang.Long не может быть приведен к java.lang.String

Полагаю, проблема в том, что с дочерним элементом "члены" и пользователями там. Я на правильном пути / что не так или есть лучший способ сделать это? Ценю всю помощь.

Скриншот Firebase

Ответы [ 3 ]

0 голосов
/ 02 сентября 2018

Вместо этого

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

Как вы уже создали конструктор для этого класса.

0 голосов
/ 03 сентября 2018

Проблема в том, что в вашем классе модели есть набор creationDate типа String, а в вашей базе данных creationDate содержит long. Чтобы решить эту проблему, в классе вашей модели измените тип вашей собственности с String на long:

public long creationDate;

И, пожалуйста, также измените соответствующий установщик и получатель на:

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);
0 голосов
/ 02 сентября 2018

попробуйте использовать этот способ

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(); //convert land value to String value not into the String class object

Еще одна вещь, которую вам нужно изменить String member на List<User> member и изменить его метод установки и метод получения типа данных List.

Помните: Полагаю, пользователь - это класс, в котором есть данные пользователей. если это простая строка, вы можете использовать строку вместо пользователя

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...