我使用此查询来获取用户A的帖子并按时间戳排序。
以下查询按用户A提取帖子,但不按日期排序。
mDatabase = FirebaseDatabase.getInstance().getReference("posts");
String UID = "userA";
Query myTopPostsQuery = mDatabase.equalTo(UID).orderByChild("UID");
我尝试使用下面的查询,但它返回一个空集。
Query myTopPostsQuery = mDatabase.equalTo(UID).orderByChild("date");
实现结果的正确方法是什么?
这是我的数据结构:
posts
-KlgYXK01ezPjk
UID: "YiXgM3qgqcsd"
date: 1496428200000
post: "This is a Test Post by user A"
,
-KlgYXK01ezPpl
UID: "YiXgM3qgqcsd"
date: 1496428220022
post: "This is another Test Post by user A"
,
-KlgYXK01ezKjk
UID: "YiXCWsdj712"
date: 1496428203000
post: "This is a Test Post by user B"
,
答案 0 :(得分:1)
这可能不是您期望的确切答案,但在您的应用扩展时会有所帮助。
我建议您使用扇出数据结构。
通过这种方式创建一个单独的节点user-posts
,您可以在其中存储各个用户的所有帖子,如下所示:
user-posts
-YiXgM3qgqcsd //this us A's UID
KlgYXK01ezPjket4ery62
post: "This is a Test Post by user A"
date: 1496428200000
author:'A'
KlgYXK01ezPjket4ery62
post: "This is a 2nd Test Post by user A"
date: 1496428500000
author:'A'
KlgYXK01ezPjket4ery62
post: "This is a 3rd Test Post by user A"
date: 1496428600000
author:'A'
-YiXCWsdj712 //this us B's UID
KlgYXK01ezPjket4ery62
post: "This is a Test Post by user B"
date: 1496428200000
author:'B'
现在你可以查询A的帖子了:
mDatabase = FirebaseDatabase.getInstance().getReference("user-posts");
String UID = "userA";
Query myTopPostsQuery = mDatabase.child(UID).limitToLast(10);
由于将数据推送到节点会创建一个唯一的密钥,默认情况下按时间顺序排列,您不必担心在使用limitToLast()
时按时间轴排序,从而为您提供从底部开始的帖子,即最新的< / p>
因此,只要用户创建帖子,您就可以将数据推送到不同的节点posts
和user-posts
。这更好,因为与读取数据相比,写入数据在firebase中便宜
现在,您只需从引用"user-posts/UID"
中提取数据,而不是使用firebase查询来自posts
的数据,按用户 A 过滤所有帖子,然后按时间线再次排序如果您有很多帖子,那么昂贵且缓慢
在将数据推送到不同节点时,posts
和user-posts
这可能很便宜,您可以使用下面的updateChildren()
方法:
Firebase ref = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com");
// Generate a new push ID for the new post
Firebase newPostRef = ref.child("posts").push();
String newPostKey = newPostRef.getKey();
// Create the data we want to update
Map newPost = new HashMap();
newPost.put("title", "New Post");
newPost.put("content", "Here is my new post!");
Map updatedUserData = new HashMap();
updatedUserData.put("user-posts/" + newPostKey, true);
updatedUserData.put("posts/" + newPostKey, newPost);
// Do a deep-path update
ref.updateChildren(updatedUserData, new Firebase.CompletionListener() {
@Override
public void onComplete(FirebaseError firebaseError, Firebase firebase) {
if (firebaseError != null) {
System.out.println("Error updating data: " + firebaseError.getMessage());
}
}
});
您可以参考firebase博客文章here