今天我遇到了Firebase的问题,无法进行查询,例如:&#34;向我提供具有该特定UID(用户唯一ID)的用户的所有项目&#34; < /强>
使用推送方法添加项目,这会创建唯一ID。有没有办法绕过这种请求的唯一ID?
任何帮助都会受到高度赞赏。
提前多多感谢,
当前代码:
//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));
}
});
答案 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);