【问题标题】:Cannot retrieve a list into Firebase Database无法将列表检索到 Firebase 数据库
【发布时间】:2017-04-17 03:53:42
【问题描述】:

我目前正在处理一个使用 Firebase 数据库的项目,但我无法以列表的形式检索数据。

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

{
  "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"
  } ]
}

在我的 Android 应用程序中,我正在尝试使用以下查询和代码(在 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>>(){

    })
  }
})

moods 声明为:private var moods = emptyList&lt;Mood&gt;()Mood 类是(它是 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;
  }

}

每次将DataSnapshot 转换为具有以下堆栈跟踪的列表时,应用程序都会崩溃:

12-02 10:20:01.497 22282-22282/com.test.app E/AndroidRuntime: 致命 例外:主进程:com.test.app,PID:22282 com.google.firebase.database.DatabaseException:需要一个列表,而 反序列化,但有一个类 java.util.HashMap 在 com.google.android.gms.internal.zzbqi.zza(未知来源) 在 com.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.gms.internal.zzbmz.zza(未知来源) 在 com.google.android.gms.internal.zzbnz.zzYj(未知来源) 在 com.google.android.gms.internal.zzboc$1.run(未知来源) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5417) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

我不明白为什么会检索到HashMap...事实上,在之前的项目中,使用类似的代码,Firebase 给了我一个 lsit 的预期。

为了做个对比,这里是之前项目的代码(java)。

已导入 Firebase 数据库的 json:

{
  "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"
  }]
}

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

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

还有Book类的代码:

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

代码按预期工作。

我错过了 Firebase 数据库中的查询吗?是否有可能将我的数据检索为列表而不是哈希图?

感谢您的帮助!

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    您需要访问onDataChange 中的结果列表,如下所示(这是在 Java 中,因此您可以转换为 Kotlin :))

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

    【讨论】:

    • 谢谢,它有效!所以现在的问题是为什么我的代码在一个项目而不是另一个项目中工作.. :)
    猜你喜欢
    • 2017-07-07
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    • 2015-01-27
    • 2020-11-30
    相关资源
    最近更新 更多