【问题标题】:Search data in Firebase | android在 Firebase 中搜索数据 |安卓
【发布时间】:2018-03-27 23:01:37
【问题描述】:

我有应用程序,并且正在使用 Firebase 实时数据库。我需要从Search 获取所有数据并使用以下代码:

      myRef = FirebaseDatabase.getInstance().getReference();
  Query query = myRef.orderByChild("Search");
  query.addValueEventListener(new ValueEventListener() {
      @Override
      public void onDataChange(DataSnapshot dataSnapshot) {
          GenericTypeIndicator<ArrayList<String>> t = new GenericTypeIndicator<ArrayList<String>>(){};
          test2 = dataSnapshot.getValue(t);

我需要在 ArrayList 中获取所有内容,但现在我遇到了异常

com.google.firebase.database.DatabaseException:需要一个列表,而 反序列化,但得到了一个类 java.util.HashMap

数据库结构:

我该如何解决这个问题?我需要从Search 中的ArrayList 获取所有数据。 如果您需要,我可以发布活动和日志中的所有代码。

Json:

{
  "Search" : [ "Eggs", "Milk", "Apples", "Carrot", "Sugar", "Potato" ]
}

【问题讨论】:

  • 将你的数据库结构示例添加到问题中,不知道它不可能给你一个正确的答案
  • 请添加您的数据库结构。
  • @AlexMamo 好的。做到了吗
  • 您在问题中包含了 JSON 树的图片。请将其替换为实际的 JSON 作为文本,您可以通过单击 your Firebase Database console 中的导出 JSON 链接轻松获得。将 JSON 作为文本使其可搜索,让我们可以轻松地使用它来测试您的实际数据并在我们的答案中使用它,一般来说这只是一件好事。
  • 好的。我做到了。

标签: java android firebase firebase-realtime-database


【解决方案1】:

假设 object 节点是您的 Firebase 数据库根的直接子节点,要解决此问题,请使用以下代码:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference searchRef = rootRef.child("object").child("Search");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        List<String> list = new ArrayList<>();
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String value = ds.getValue(String.class);
            list.add(value);
        }
        Log.d("TAG", list.toString());
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
searchRef.addListenerForSingleValueEvent(valueEventListener);

输出将是:

Eggs
Milk
Apples
Carrot
Sugar
Potato

【讨论】:

  • 在您的代码String value = ds.getValue(); 的这个片段中,编译器指出Required: java.lang.String Found: java.lang.Object 也许我需要编写这样的代码:String value = ds.getValue(String.class);
  • 对不起,我的错误。刚刚编辑了我的答案。它可以与getValue(String.class) 一起使用吗?
  • 在你的代码中的这个片段Log.d("TAG", list);编译器表明Wrong 2nd argument type, Found:' java.util.List&lt;java.lang.String&gt;', required: 'java.lang.String'
  • 更新为list.toString()。请再次查看我的更新答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多