无法将列表检索到Firebase数据库 [英] Cannot retrieve a list into Firebase Database

查看:110
本文介绍了无法将列表检索到Firebase数据库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前正在使用Firebase数据库开展一个项目,并且无法将数据检索为列表。



这里是我导入到firebase中的json示例:

  {
mood:[{
date:1480625911154,
:Lorem Ipsum,
status:Ok,
user:812c3772-5e3b-4776-8b4c-41ee3047011d
},{
日期:1480626081958,
原因:Lorem Ipsum,
status:Ok,
user:3fca7432-ac0b-40f8-b898-929df4d3a2e8$
date:1480626567674,
原因:Lorem Ipsum,
status:Ok,
user: 22e9254a-161b-4126-8cd2-7e5ebe03fa6f
}]
}

进入我的Android应用程序,我试图用下面的查询和代码检索特定用户的数据(它在Kotlin中):

pre $ $ $ C> FirebaseDatabase.getInstance()。getReference( 心情)。orderByChild( 用户)。equalTo(FA (错误:DatabaseError)
{
}
$ b重新获取onCancelled(错误:DatabaseError)

$ b $ $ b重写fun onDataChange(snapshot:DataSnapshot)
{
moods = snapshot.getValue(object:GenericTypeIndicator< List< Mood>>(){

})




$ b $ moods 被声明为: private var moods = emptyList< Mood>()并且 Mood 是java):

pre $ code $ @ $ $ $ $ b $ public final class $
实现Serializable
{

public String user;

public String status;

public String原因;

公共长日期;

public Mood()
{
super();

$ b $ public public(字符串用户,字符串状态,字符串原因,长日期)
{
this.user = user;
this.status = status;
this.reasons =原因;
this.date = date;
}

}

每次,应用程序崩溃使用以下堆栈跟踪将 DataSnapshot 转换为列表:


02 10:20:01.497 22282-22282 / com.test.app E / AndroidRuntime:致命
EXCEPTION:主进程:com.test.app,PID:22282
com.google.firebase.database。 DatabaseException:期望一个列表而
反序列化,但得到com.google.android.gms.internal.zzbqi.zza(未知源)
com com.util.HashMap
类。 google.android.gms.internal.zzbqi.zza(未知来源)
在com.google.android.gms.internal.zzbqi.zza(未知来源)
来自com.google.firebase.database。 DataSnapshot.getValue(未知源)
在com.test.app.fragment.StatsFragment $ onRetrieveBusinessObjects $ 1.onDataChange(StatsFragment.kt:46)
在com.google.firebase.database.Query $ 1.onDataChange (未知来源)
com.google.android.gm s.internal.zzbmz.zza(未知来源)
在com.google.android.gms.internal.zzbnz.zzYj(未知来源)
来自com.google.android.gms.internal.zzboc $ 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:5417)
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)我不明白为什么要检索一个 HashMap ...事实上,在以前的项目中,有一个类似的代码,Firebase给了我一个像预期的lsit。

为了做一个比较,这里是前一个项目的代码(在java中)。

json已经是impor了加入到Firebase数据库中:

$ p $ $ books
cartoonist:Test1 ,
id:10,
image:http://static.fnac-static.com/multimedia/Images/FR/NR/22/e1/7e/8315170 /1507-1.jpg,
price:15.95,
publication:2016-11-01T00:00:00 + 01:00,
summaryExtract :Loremp Ipsum,
summaryFull:Loremp Ipsum,
tome:Tome 24:Le Testament de William S
},{
漫画家:Riad Sattouf,
id:1,
image:http://static.fnac-static.com/multimedia/Images/FR/NR/da /9d/7c/8166874/1507-1.jpg,
price:20.90,
publication:2016-10-01T00:00:00 + 01:00,
summaryExtract:Loremp Ipsum,
summaryFull:Loremp Ipsum,
tome:Tome 3:L'Arabe du futur
}]
}

这里是查询Firebase的代码(在java中):

  FirebaseDatabase.getI addListenerForSingleValueEvent(new ValueEventListener()
{
@Override
public void onDataChange(DataSnapshot dataSnapshot)
{
final List< Book> books = dataSnapshot.getValue(new GenericTypeIndicator< List< Book>>()
{
});

$ b @Override
public void onCancelled(DatabaseError databaseError)
{
}
});

Book class的代码:

  @IgnoreExtraProperties 
public final class Book
实现Serializable
{

public String id;

public String title;

public String tome;

公共字符串漫画家;

public String publication;

public String price;

public String image;

public String summaryFull;

public String summaryExtract;
$ b $ public Book()
{
super();

$ b public Book(String id,String cartoonist,String image,String price,String publication,String summaryExtract,
String summaryFull,String title,String tome)
{
this.id = id;
this.cartoonist =漫画家;
this.image = image;
this.price = price;
this.publication = publication;
this.summaryExtract = summaryExtract;
this.summaryFull = summaryFull;
this.title = title;
this.tome = tome;

$ b @Exclude
public String getFormattedDate()
{
final DateTime dateTime = new DateTime(publication);
return dateTime.monthOfYear()。getAsText(Locale.getDefault())++ dateTime.getYear();

$ / code>

代码正常工作。 $ b

我错过了Firebase数据库中的查询吗?有没有可能检索我的数据作为一个列表而不是一个哈希表?



感谢您的帮助!

onDataChange 中的结果列表,如下所示(这是用Java编写的,因此可以转换成Kotlin: ))
$ b $ pre $ for(DataSnapshot childSnapshot:dataSnapshot.getChildren()){
Book book = childSnapshot.getValue(Book 。类);
}


I am currently working on a project with Firebase Database and I cannot retrieve data as a list.

Here a sample of the json I have imported into firebase :

{
  "mood" : [ {
    "date" : 1480625911154,
    "reasons" : "Lorem Ipsum",
    "status" : "Ok",
    "user" : "812c3772-5e3b-4776-8b4c-41ee3047011d"
  }, {
    "date" : 1480626081958,
    "reasons" : "Lorem Ipsum",
    "status" : "Ok",
    "user" : "3fca7432-ac0b-40f8-b898-929df4d3a2e8"
  }, {
    "date" : 1480626567674,
    "reasons" : "Lorem Ipsum",
    "status" : "Ok",
    "user" : "22e9254a-161b-4126-8cd2-7e5ebe03fa6f"
  } ]
}

Into my Android application, I am trying to retrieve data for a specific user with the following query and code (it is in Kotlin) :

FirebaseDatabase.getInstance().getReference("mood").orderByChild("user").equalTo("fa224092-2dfa-49c4-9fb6-c63eccf61a8b").addListenerForSingleValueEvent(object : ValueEventListener
{
  override fun onCancelled(error: DatabaseError)
  {
  }

  override fun onDataChange(snapshot: DataSnapshot)
  {
    moods = snapshot.getValue(object : GenericTypeIndicator<List<Mood>>(){

    })
  }
})

Where moods is declared as : private var moods = emptyList<Mood>() and the Mood class is (it is java) :

@IgnoreExtraProperties
public final class Mood
    implements Serializable
{

  public String user;

  public String status;

  public String reasons;

  public long date;

  public Mood()
  {
    super();
  }

  public Mood(String user, String status, String reasons, long date)
  {
    this.user = user;
    this.status = status;
    this.reasons = reasons;
    this.date = date;
  }

}

Each time, the app crashes on the transformation of the DataSnapshot to a list with the following stacktrace :

12-02 10:20:01.497 22282-22282/com.test.app E/AndroidRuntime: FATAL EXCEPTION: main Process: com.test.app, PID: 22282 com.google.firebase.database.DatabaseException: Expected a List while deserializing, but got a class java.util.HashMap at com.google.android.gms.internal.zzbqi.zza(Unknown Source) at com.google.android.gms.internal.zzbqi.zza(Unknown Source) at com.google.android.gms.internal.zzbqi.zza(Unknown Source) at com.google.firebase.database.DataSnapshot.getValue(Unknown Source) at com.test.app.fragment.StatsFragment$onRetrieveBusinessObjects$1.onDataChange(StatsFragment.kt:46) at com.google.firebase.database.Query$1.onDataChange(Unknown Source) at com.google.android.gms.internal.zzbmz.zza(Unknown Source) at com.google.android.gms.internal.zzbnz.zzYj(Unknown Source) at com.google.android.gms.internal.zzboc$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:5417) 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)

I do not understand why a HashMap is retrieved... In fact, in previous project, with a similar code, Firebase give me a lsit as expected.

In order to do a comparison, here a code of the previous project (in java).

The json that has been imported into Firebase Database :

{
  "books" : [ {
    "cartoonist" : "Test1",
    "id" : "10",
    "image" : "http://static.fnac-static.com/multimedia/Images/FR/NR/22/e1/7e/8315170/1507-1.jpg",
    "price" : "15.95",
    "publication" : "2016-11-01T00:00:00+01:00",
    "summaryExtract" : "Loremp Ipsum",
    "summaryFull" : "Loremp Ipsum",
    "tome" : "Tome 24 : Le testament de William S"
  }, {
    "cartoonist" : "Riad Sattouf",
    "id" : "1",
    "image" : "http://static.fnac-static.com/multimedia/Images/FR/NR/da/9d/7c/8166874/1507-1.jpg",
    "price" : "20.90",
    "publication" : "2016-10-01T00:00:00+01:00",
    "summaryExtract" : "Loremp Ipsum",
    "summaryFull" : "Loremp Ipsum",
    "tome" : "Tome 3 : L'Arabe du futur"
  }]
}

Here the code (in java) that queries Firebase :

FirebaseDatabase.getInstance().getReference().child("books").addListenerForSingleValueEvent(new ValueEventListener()
{
  @Override
  public void onDataChange(DataSnapshot dataSnapshot)
  {
    final List<Book> books = dataSnapshot.getValue(new GenericTypeIndicator<List<Book>>()
    {
    });
  }

  @Override
  public void onCancelled(DatabaseError databaseError)
  {
  }
});

And the code of the Book class :

@IgnoreExtraProperties
public final class Book
    implements Serializable
{

  public String id;

  public String title;

  public String tome;

  public String cartoonist;

  public String publication;

  public String price;

  public String image;

  public String summaryFull;

  public String summaryExtract;

  public Book()
  {
    super();
  }

  public Book(String id, String cartoonist, String image, String price, String publication, String summaryExtract,
      String summaryFull, String title, String tome)
  {
    this.id = id;
    this.cartoonist = cartoonist;
    this.image = image;
    this.price = price;
    this.publication = publication;
    this.summaryExtract = summaryExtract;
    this.summaryFull = summaryFull;
    this.title = title;
    this.tome = tome;
  }

  @Exclude
  public String getFormattedDate()
  {
    final DateTime dateTime = new DateTime(publication);
    return dateTime.monthOfYear().getAsText(Locale.getDefault()) + " " + dateTime.getYear();
  }

The code works as expected.

Did I miss something with the query in Firebase Database ? Is there a possibility to retrieve my data as a list and not as a hashmap ?

Thank you for your help !

解决方案

you need to access list of results in onDataChange as follows (this is in Java so will let you convert to Kotlin :) )

                for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) {
                    Book book = childSnapshot.getValue(Book.class);
                }

这篇关于无法将列表检索到Firebase数据库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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