将数据从Firebase检索到实体

时间:2018-11-08 17:17:01

标签: java android firebase firebase-realtime-database

我正在尝试从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是一个实体。 除了使用getter和setter和完整的构造方法创建新类并重复所有操作之外,还有其他方法吗?

我得到的错误是:

  

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 :(得分:1)

要解决此问题,您需要删除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