Android - Firebase复杂(或不复制)查询 - 使用唯一ID发出问题

时间:2016-05-12 11:21:46

标签: android firebase firebase-realtime-database

今天我遇到了Firebase的问题,无法进行查询,例如:&#34;向我提供具有该特定UID(用户唯一ID)的用户的所有项目&#34; < /强>

使用推送方法添加项目,这会创建唯一ID。有没有办法绕过这种请求的唯一ID?

任何帮助都会受到高度赞赏。

提前多多感谢,

Firebase结构: current firebase structure

当前代码:

//New firebase instance
Firebase mFirebase = new Firebase(Constants.FIREBASE_ITEMS_URL);

//Query on records to find items related to users only
mQuery = mFirebase.child(uid).orderByChild(uid).equalTo(uid);

        mQuery.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                getUpdates(dataSnapshot);
            }

            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s) {
                getUpdates(dataSnapshot);
            }

            @Override
            public void onChildRemoved(DataSnapshot dataSnapshot) {
                getUpdates(dataSnapshot);
            }

            @Override
            public void onChildMoved(DataSnapshot dataSnapshot, String s) {
                getUpdates(dataSnapshot);
            }

            @Override
            public void onCancelled(FirebaseError firebaseError) {
                Log.i(LOG_TAG, String.valueOf(firebaseError));
            }
        });

4 个答案:

答案 0 :(得分:2)

我能看到完成的最佳方式&#34;向我提供具有该特定UID(用户唯一ID)&#34; 的用户的所有项目将是修改您的用户firebase结构如下:

{
  users: {
    user1: {
      user_details { //whatever you need in here// }
      items: {
        -KHZlfskXT_aQtVOZytd: true,
        item1: true,
        item2: true,
        item3: true
      }
    }
  }
}

然后,您可以查询并获取每个用户的所有itemId的列表,然后您可以使用该itemIds列表来检索相应的项目 - 使用此布局发出请求:(i&#39; ve用javascript编写)

var userItemsRef = mFirebase.child('users').child(uid).child('items')
var itemsRef = mFirebase.child('items');

userItemsRef.on('child_added', function(dataSnap) {
  itemsRef.child(dataSnap.key()).once('value', function(snap) {
    // do whatever you need to with the item
  });
});

有关此类事情的未来阅读,请查看this article on denormalising your data in firebase

答案 1 :(得分:1)

我肯定和格兰特认为,每个用户存储项目可能更好。

但据我所知,您还应该能够获得当前结构中的项目:

String uid = "bd4dd...a670";
Firebase firebase = new Firebase("https://<app-name>.firebaseio.com");
Query query = firebase.child("items").orderByChild("uid").equalTo(uid);

使用Firebase排序的查询“跳过一个级别”。所以上面说:按uid订购所有商品,然后给我指定用户的商品。

答案 2 :(得分:1)

请注意,由于某些未知原因,orderByChild(“ X”)。equalsTo(“ Y”)有时会始终返回不完整或空结果。

当我遇到这个问题时,setPersistence(false)返回了正确的结果(我花了2个小时试图了解为什么Firebase在所有元素都使用相同uid的列表中仅按uid值返回单个结果) 。 但是,当我将代码恢复为setPersistence(true)时,问题又回来了。

因此,我将setPersistence(false)卸载,然后使用setPersistence(true)重新安装了该应用程序,并且此问题得以解决(暂时)。

这是一个严重的问题,因为使用setPersistence(true)可以节省大量带宽。我仍然不确定如何永久修复它。

进一步阅读: https://github.com/invertase/react-native-firebase/issues/13

更新

请参阅此链接以获得更好的解释和解决方案: Firebase Offline Capabilities and addListenerForSingleValueEvent

我在链接中实现了建议,即使用addValueEventListener而不是addListenerForSingleValueEvent,它解决了该问题!

不过,如果您担心Firebase对数据进行无休止的查询,而不是仅对单个查询进行查询,只需确保在获取所有数据或退出片段/活动时使用mDatabaseReference删除侦听器。 removeEventListener([yourEventListener])。

答案 3 :(得分:0)

FirebaseAuth mAuth = FirebaseAuth.getInstance();
    //getting the current user id
    String uid = mAuth.getCurrentUser().getUid();
    DatabaseReference dbroot = FirebaseDatabase.getInstance().getReference().getRoot();
    DatabaseReference items = dbroot.child("items");
    //firebase query
    Query  q = items.orderByChild("uid").equalTo(uid);