Firebase在Android中的orderBy条件

时间:2017-06-03 06:19:04

标签: android firebase

我使用此查询来获取用户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"
    ,

1 个答案:

答案 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>

因此,只要用户创建帖子,您就可以将数据推送到不同的节点postsuser-posts。这更好,因为与读取数据相比,写入数据在firebase中便宜

现在,您只需从引用"user-posts/UID"中提取数据,而不是使用firebase查询来自posts的数据,按用户 A 过滤所有帖子,然后按时间线再次排序如果您有很多帖子,那么昂贵且缓慢

在将数据推送到不同节点时,postsuser-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