Получить данные из Firebase в объект - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь получить данные из базы данных Firebase, чтобы добавить их в локальную базу данных.

Этот код:

database = FirebaseDatabase.getInstance();
myRef = database.getReference();     
Query LANGUAGES_REF = myRef.child("languages").orderByChild("id");

LANGUAGES_REF.addChildEventListener(new ChildEventListener() {
                @Override
                public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {    
                if (dataSnapshot.hasChildren()) {
                Iterator<DataSnapshot> iterator = dataSnapshot.getChildren().iterator();
                       do {
                           Language language = iterator.next().getValue(Language.class);
                           languageR.insert(language);
                          } while (iterator.hasNext());
               }

не работает, и я знаю, что это так, потому что Language.class является сущностью.Есть ли способ, кроме создания нового класса с геттерами и сеттерами и полным конструктором ... и повторения всего ??

Я получил ошибку:

com.google.firebase.database.DatabaseException: не удается преобразовать объект типа java.lang.Long в тип com.android.android.Database.Entities.Language

в этой строке:

Language language = iterator.next().getValue(Language.class);

Спасибо

редактировать: структура базы данных Firebase

"languages" : {
    "LHZ7cAeOdPn-LwHNjIk" : {
        "id" : 1,
        "langName" : "Russian"
    },
    "LHZ7cAtXTGBlnWsdQOd" : {
        "id" : 2,
        "langName" : "French"
    },
    "LHZ7cAvrRs0rgI-PaJd" : {
        "id" : 3,
        "langName" : "Turkish"
    }
}

language.class

import java.io.Serializable;

import androidx.room.Entity;
import androidx.room.PrimaryKey;

@Entity
public class Language implements Serializable {

    @PrimaryKey(autoGenerate = true)
    private int id;

    private String langName;

    public int getId() {
        return id;
    }

    public String getLangName() {
        return langName;
    }

    public Language(String langName) {
        this.langName = langName;
    }

    public void setId(int id) {
        this.id = id;
    }
}

1 Ответ

0 голосов
/ 08 ноября 2018

Чтобы решить эту проблему, вам нужно удалить цикл do-while, потому что нет необходимости повторять, используя метод getChildren(), вы можете получить данные непосредственно из объекта dataSnapshot, например:

@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
    Language language = dataSnapshot.getValue(Language.class);
    languageR.insert(language);
    Log.d(TAG, language.getLangName());
}

Вывод в вашем logcat будет:

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