2016-07-24 27 views
0

Firebaseの子ノードからデータを取得しようとしています。しかし、それはCan't convert object of type java.lang.String to type uk.co.stableweb.geethika.model.DailyVerse例外をスローします。Android Firebaseが子ノードからデータを取得します

これはFirebaseデータベースの構造です。ここで

Firebase database structure.

コードです。私は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値を取得すると、データを取得します。

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 

ハッシュマップを使用してこれらの値を取得することは可能だと思います。しかし、それはもはや推奨されていないというコメントがありました。この方法

mRef.addChildEventListener(childEventListener); 

ことで

+0

タイプとして追加するには、あなたがverse_content私は理解していない – AndroidHacker

+0

ためfirebaseデータベースに宣言するタイプをチェックし、JSONなどないAndroidのデータベースストアの値であるので、タイプは文字列です。右? – Isuru

答えて

3

あなたは

.child("daily_verse"); 

子供たちのためにサブスクライブします。 daily_verseには、verse_contentとverse_titleという2つの子があります。これらの子の型はStringです。したがって、onChildAddリスナーで2つのString datasnapshotを取得します。

更新: はこのような何かを試してみてください:

mRef = FirebaseDatabase.getInstance().getReference(); 
mRef.keepSynced(true); 

ChildEventListener childEventListener = new ChildEventListener() { 
    @Override 
    public void onChildAdded(DataSnapshot dataSnapshot, String previousChildName) { 
     Log.d("Child Event,Verse", dataSnapshot.getKey()); 
     if ("daily_verse".equal(dataSnapshot().getKey){ 
      dailyVerse = dataSnapshot.getValue(DailyVerse.class); 
      Log.d("TEST","Object: "+dailyVerse); 
      if (dailyVerse!=null){ 
       Log.d("TEST","values: "+dailyVerse.verse_title+", "+dailyVerse.verse_content); 
      } 
     } 

    } 

    @Override 
    public void onChildChanged(DataSnapshot dataSnapshot, String previousChildName) { 
     Log.d("Child Event,Verse", "onChildChanged:" + dataSnapshot.getKey()); 
     if ("daily_verse".equal(dataSnapshot().getKey){ 
      dailyVerse = dataSnapshot.getValue(DailyVerse.class); 
      Log.d("TEST","Changed object: "+dailyVerse); 
      if (dailyVerse!=null){ 
      Log.d("TEST","Changed values: "+dailyVerse.verse_title+", "+dailyVerse.verse_content); 
      } 
     } 
    } 

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

あなたが親オブジェクトからイベントをサブスクライブやイベントリスナーでキーを確認する必要があります。

+0

はい、しかしstringを返します。返された値がobjectの場合、なぜ次の文を使用できません。 dailyVerse = dataSnapshot.getValue(DailyVerse.class); – Isuru

+0

@Isuru更新情報をご覧ください。私は間違っていた。 –

+0

まだ、動作していません。私はD/TESTとしてログを取得します。DataSnapshot {key = daily_verse、value = {verse_title =ගීතාවලිය119:30、verse_content =විශ්වාසකමේමාර්ගයතෝරාගතිමි。 }} D /チャイルドイベント、詩が追加されました:geethika – Isuru

5

Javaコード内のJSONおよびフィールド/ゲッターのプロパティの名前には十分注意してください。一致しない場合、Firebaseクライアントはそれらの間の値を一致させることができません。

あなたのJSONは、あなたのJavaクラスがいずれかでなければならないので、verse_titleverse_contentを持っています

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

または:FirebaseのAndroid SDK 9.2以降

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

、あなたもあなたに注釈を付けることができます正しいJSONプロパティにマップするJavaコード。だから、正しいマッピングを取得するための第三の方法は次のとおりです。

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

私はそう答えにタイプミスがある場合は私に知らせて、しかしその最新のバリアントを試していません。

1
DataRef = FirebaseDatabase.getInstance().getReference().child("Users"); 

DataRef.addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       String acctname = (String)dataSnapshot.child("Name").getValue(); 
       String acctmail = (String)dataSnapshot.child("Email").getValue(); 

      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
}); 
0
ArrayList<EventsResponse> usersEventsList = new ArrayList<>(); 
    dummyIdsArrayList = new ArrayList<>(); 
    Iterator<DataSnapshot> eventsIterator = dataSnapshot.getChildren().iterator(); 
    while (eventsIterator.hasNext()) { 
     DataSnapshot eventsSnapShot = eventsIterator.next(); 
     EventsResponse eventsResponse = new EventsResponse(); 
     eventsResponse.setEventName(eventsSnapShot.getKey()); 
     Iterator<DataSnapshot> eventChildIterator = eventsSnapShot.getChildren().iterator(); 
     while (eventChildIterator.hasNext()) { 
      DataSnapshot eventchildSnapshot = eventChildIterator.next(); 
      if (eventchildSnapshot.getKey().equals("is_recursive")) { 
       eventsResponse.setRecursive((Boolean) eventchildSnapshot.getValue()); 
      } else if (eventchildSnapshot.getKey().equals("is_notif")) { 
       eventsResponse.setNotif((Boolean) eventchildSnapshot.getValue()); 
      } else if (eventchildSnapshot.getKey().equals("is_editable")) { 
       eventsResponse.setEditable((Boolean) eventchildSnapshot.getValue()); 
      } else if (eventchildSnapshot.getKey().equals("is_visible")) { 
       eventsResponse.setVisible((Boolean) eventchildSnapshot.getValue()); 
      } else if (eventchildSnapshot.getKey().equals("name")) { 
       eventsResponse.setName(eventchildSnapshot.getValue().toString()); 
      } else if (eventchildSnapshot.getKey().equals("date")) { 
       Iterator<DataSnapshot> eventChildDateIterator = eventchildSnapshot.getChildren().iterator(); 
       while (eventChildDateIterator.hasNext()) { 
        DataSnapshot eventchildDateSnapshot = eventChildDateIterator.next(); 
        if (eventchildDateSnapshot.getKey().equals("day")) { 
         eventsResponse.setDay(eventchildDateSnapshot.getValue().toString()); 
        } else if (eventchildDateSnapshot.getKey().equals("month")) { 
         eventsResponse.setMonth(eventchildDateSnapshot.getValue().toString()); 
        } else if (eventchildDateSnapshot.getKey().equals("year")) { 
         eventsResponse.setYear(eventchildDateSnapshot.getValue().toString()); 
        } 
       } 
      } else { 
       eventsResponse.setNotif(true); 
       eventsResponse.setVisible(false); 
      } 
     } 

あなたがデータをフェッチすることができない場合、あなたはその形式でデータをフェッチすることができます。

1

firebaseモデルクラスを使用する場合は、firebase用に空のコンストラクタを組み込む必要があります。

てみてください、ここで不一致れ

public class DailyVerse { 
    public DailyVerse(){ 

    } 
} 
関連する問題