无法将列表检索到Firebase数据库 [英] Cannot retrieve a list into Firebase Database
问题描述
我目前正在使用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 theMood
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屋!
查看全文