【问题标题】:Get index data with setIndexedQuery where index not end of path使用 setIndexedQuery 获取索引数据,其中索引不是路径结尾
【发布时间】:2019-08-18 22:06:52
【问题描述】:

我有一个 Firebase 实时数据库,其布局类似于:

{
  "data": {
    "index_1": {
      "xxx": {
        "value_1": "Some data",
        "value_2": true
      },
    "index_2": {
      "xxx": {
        "value_1": "Some data",
        "value_2": true
      },
    "index_3": {
      "xxx": {
        "value_1": "Some data",
        "value_2": true
      },
   },
   "keys": {
     "user1": {
       "index_1": true,
       "index_2": true
     },
     "user2": {
       "index_1": true,
       "index_3": true
     }

   }
}

还有一个简单的java类:

public class Data {
    private String value_1;
    private Boolean value_2;
    ...
    getters/setters
    ...
}

是否有任何(简单的)方法可以从 /data/{index}/xxx/{object} 获取对象?

如果布局是/data/{index}/{object},例如:

"data": {
  "index_1": {
    "value_1": "Some data",
    "value_2": true
  }
}

可以使用

keyQuery = FirebaseDatabase.getInstance()
                           .getReference("keys")
                           .orderByKey();
dataRef = FirebaseDatabase.getInstance().getReference("data");
FirebaseRecyclerOption<Data> options = new FirebaseRecyclerOptions.Builder<Data>().
        .setIndexedQuery(keyQuery, dataRef, Data.class)
        .build();

但是当索引不仅仅在想要的数据之前时,我还没有找到任何方法来做到这一点。

【问题讨论】:

    标签: java android firebase firebase-realtime-database firebaseui


    【解决方案1】:

    我找到了一种通过创建自定义 SnapshotParser 来使用 FirebaseRecyclerOption 解决它的方法

    SnapshotParser<Data> parser = new SnapshotParser<Data>() {
        @NonNull
        @Override
        public Data parseSnapshot(@NonNull DataSnapshot snapshot) {
            return snapshot.child("xxx").getValue(Data.class);
        }
    }
    FirebaseRecyclerOption<Data> options = new FirebaseRecyclerOptions.Builder<Data>().
        .setIndexedQuery(keyQuery, dataRef, parser)
        .build();
    

    【讨论】:

      【解决方案2】:

      是否有任何(简单的)方法可以从 /data/{index}/xxx/{object} 获取对象?

      是的,使用以下代码行:

      DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
      DatabaseReference dataRef = rootRef.child("data");
      ValueEventListener valueEventListener = new ValueEventListener() {
          @Override
          public void onDataChange(DataSnapshot dataSnapshot) {
              for(DataSnapshot ds : dataSnapshot.getChildren()) {
                  String value_1 = ds.child("xxx").child("value_1").getValue(String.class);
                  boolean value_2 = ds.child("xxx").child("value_2").getValue(Boolean.class);
                  Log.d(TAG, value_1 + " / " + value_2);
              }
          }
      
          @Override
          public void onCancelled(@NonNull DatabaseError databaseError) {
              Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
          }
      };
      dataRef.addListenerForSingleValueEvent(valueEventListener);
      

      如果你想使用FirebaseRecyclerOption,你的数据库架构应该是这样的:

      "data": {
        "index_1": {
          "value_1": "Some data",
          "value_2": true
        }
      }
      

      没有那个额外的xxxchild。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-14
        • 2018-04-24
        相关资源
        最近更新 更多