Android Firebase从子节点检索数据 [英] Android Firebase retrieve data from child node

查看:64
本文介绍了Android Firebase从子节点检索数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试从Firebase子节点获取数据.但是它会抛出Can't convert object of type java.lang.String to type uk.co.stableweb.geethika.model.DailyVerse异常.

I'm trying to get the data from Firebase child node. But it throws Can't convert object of type java.lang.String to type uk.co.stableweb.geethika.model.DailyVerse exception.

这是我的Firebase数据库的结构.

This is the structure of my Firebase database.

这是代码.我正在使用新的Android Firebase 文档.

Here is the code. I'm using Android Firebase new documentation.

mRef = FirebaseDatabase.getInstance().getReference().child("daily_verse");
mRef.keepSynced(true);

ChildEventListener childEventListener = new ChildEventListener() {
    @Override
    public void onChildAdded(DataSnapshot dataSnapshot, String previousChildName) {
        Log.d("Child Event,Verse", dataSnapshot.getKey());

        dailyVerse = dataSnapshot.getValue(DailyVerse.class);

    }

    @Override
    public void onChildChanged(DataSnapshot dataSnapshot, String previousChildName) {
        Log.d("Child Event,Verse", "onChildChanged:" + dataSnapshot.getKey());

        dailyVerse = dataSnapshot.getValue(DailyVerse.class);
    }

    @Override
    public void onChildRemoved(DataSnapshot dataSnapshot) {

    }

    @Override
    public void onChildMoved(DataSnapshot dataSnapshot, String previousChildName) {

    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        Log.w("Firebase", "onCancelled", databaseError.toException());
        Toast.makeText(context, "Failed to load verse",
                Toast.LENGTH_SHORT).show();
    }
};

mRef.addChildEventListener(childEventListener);

和模型类.

public class DailyVerse {

    private String verse_title;
    private String verse_content;

    public String getVerseTitle() {
        return verse_title;
    }

    public void setVerseTitle(String verse_title) {
        this.verse_title = verse_title;
    }

    public String getVerseContent() {
        return verse_content;
    }

    public void setVerseContent(String verse_content) {
        this.verse_content = verse_content;
    }
}

还有LogCat.

com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type uk.co.stableweb.geethika.model.DailyVerse
  at com.google.android.gms.internal.zzalq.zzd(Unknown Source)
  at com.google.android.gms.internal.zzalq.zzb(Unknown Source)
  at com.google.android.gms.internal.zzalq.zza(Unknown Source)
  at com.google.firebase.database.DataSnapshot.getValue(Unknown Source)
  at uk.co.stableweb.geethika.VerseActivityFragment$1.onChildAdded(VerseActivityFragment.java:63)
  at com.google.android.gms.internal.zzahh.zza(Unknown Source)
  at com.google.android.gms.internal.zzajh.zzctc(Unknown Source)
  at com.google.android.gms.internal.zzajk$1.run(Unknown Source)
  at android.os.Handler.handleCallback(Handler.java:739)
  at android.os.Handler.dispatchMessage(Handler.java:95)
  at android.os.Looper.loop(Looper.java:148)
  at android.app.ActivityThread.main(ActivityThread.java:5461)
  at java.lang.reflect.Method.invoke(Native Method)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

但是,如果我按以下方式更改数据库引用.并获取dataSnapshot值,它将获取数据.

But if I change the database reference as follows. And get the dataSnapshot value, it grabs the data.

mRef = FirebaseDatabase.getInstance().getReference("daily_verse");

testVal = (String) dataSnapshot.getValue();
Log.d("TEST", testVal);

V/FA: Activity resumed, time: 278033062
D/Child Event,Verse added: verse_content
D/TEST: විශ්වාසකමේ මාර්ගය තෝරා ගතිමි. ඔබගේ විනිශ්චයන් මා ඉදිරියෙහි තබා ගතිමි.
D/Child Event,Verse added: verse_title
D/TEST: ගීතාවලිය 119:30

我认为可以使用HashMap获得这些值.但是有评论说不再推荐.

I think it is possible to get those values using HashMap. But there was a comment saying it is no longer recommended.

推荐答案

请特别注意JSON中的属性名称以及Java代码中的字段/获取器.如果它们不匹配,则Firebase客户端将无法匹配它们之间的值.

Pay careful attention to the names of your properties in the JSON and your fields/getters in the Java code. If they don't match, the Firebase client won't be able to match the values between them.

您的JSON具有verse_titleverse_content,因此您的Java类必须为 :

Your JSON has verse_title and verse_content, so your Java class must be either:

public class DailyVerse {
    public String verse_title;
    public String verse_content;    
}

:

public class DailyVerse {

    private String verse_title;
    private String verse_content;

    public String getVerse_title() {
        return verse_title;
    }

    public void setVerse_title(String verse_title) {
        this.verse_title = verse_title;
    }

    public String getVerse_content() {
        return verse_content;
    }

    public void setVerse_content(String verse_content) {
        this.verse_content = verse_content;
    }
}

自从Firebase Android SDK 9.2起,您还可以注释Java代码以映射到正确的JSON属性.因此,获取正确映射的第三种方法是:

Since Firebase Android SDK 9.2, you can also annotate your Java code to map to the correct JSON properties. So a third way to get the correct mapping is:

public class DailyVerse {

    private String verse_title;
    private String verse_content;

    @PropertyName("verse_title")
    public String getVerseTitle() {
        return verse_title;
    }

    public void setVerseTitle(String verse_title) {
        this.verse_title = verse_title;
    }

    @PropertyName("verse_content")
    public String getVerseContent() {
        return verse_content;
    }

    public void setVerseContent(String verse_content) {
        this.verse_content = verse_content;
    }
}

我还没有尝试过最新版本,所以请告诉我答案是否有错字.

I haven't tried that latest variant though, so let me know if there are typos on the answer.

这篇关于Android Firebase从子节点检索数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆