简体   繁体   中英

How do I order Firebase data?

I'm creating a forum/news feed type application and currently trying to create the actual news feed/forum. So far I have a tableview which is populated by the posts consisting of the user's display name, profile picture and post text.

The issue I'm having is that it is not ordered. It displays in an unpredictable order which changes each time the application is relaunched. I have tried using ".queryOrdered(byChild: "Timestamp")" but it does not seem to be working.

What am I doing wrong?

When I simplify your code to:

var databaseRef = Database.database().reference()
databaseRef.child("49242360/Posts").queryOrdered(byChild: "Timestamp").observe(.value, with: { (snapshot) in        
    for child in (snapshot.children) {
        let snap = child as! DataSnapshot
        let dict = snap.value as! [String:AnyObject]
        let timestamp = dict["Timestamp"]!

        print("Key \(snap.key), Timestamp \(timestamp)")
    }
})
{(error) in
    print("Error: \(error.localizedDescription)")
}

It prints:

Key -L7I6Bc5MeUgiOxkzKhF, Timestamp 1520739076.673202
Key -L7I6dBS7f43e49Xuhk1, Timestamp 1520739193.693312
Key -L7IRX8Uj89LLvymgTjA, Timestamp 1520744669.853121
Key -L7IReX4TqzXcwlbphji, Timestamp 1520744704.257354
...

Second run:

Key -L7I6Bc5MeUgiOxkzKhF, Timestamp 1520739076.673202
Key -L7I6dBS7f43e49Xuhk1, Timestamp 1520739193.693312
Key -L7IRX8Uj89LLvymgTjA, Timestamp 1520744669.853121
Key -L7IReX4TqzXcwlbphji, Timestamp 1520744704.257354
...

So that seems pretty reliable in ordering.

When I expand it to also log the UID and then load the user names, I get this code:

var databaseRef = Database.database().reference()
databaseRef.child("49242360/Posts").queryOrdered(byChild: "Timestamp").observe(.value, with: { (snapshot) in

    for child in (snapshot.children) {
        let snap = child as! DataSnapshot
        let dict = snap.value as! [String:AnyObject]
        let timestamp = dict["Timestamp"]!

        let userWhoPosted = dict["User"] as! String

        print("Key \(snap.key), Timestamp \(timestamp), User \(userWhoPosted)")

        databaseRef.child("49242360/Users").child(userWhoPosted).observeSingleEvent(of: .value, with: {
            (snapshot) in
            if let userDict = snapshot.value as? [String: AnyObject]
            {
                print("User \(snapshot.key), Name \(userDict["Display Name"]!)")
            }
        })
    }
})
{(error) in
    print("Error: \(error.localizedDescription)")
}

And this output:

Key -L7I6Bc5MeUgiOxkzKhF, Timestamp 1520739076.673202, User HfxlCKx4uYhf09TF8fPITdNQtlo1
Key -L7I6dBS7f43e49Xuhk1, Timestamp 1520739193.693312, User HfxlCKx4uYhf09TF8fPITdNQtlo1
Key -L7IRX8Uj89LLvymgTjA, Timestamp 1520744669.853121, User HfxlCKx4uYhf09TF8fPITdNQtlo1
Key -L7IReX4TqzXcwlbphji, Timestamp 1520744704.257354, User HfxlCKx4uYhf09TF8fPITdNQtlo1
Key -L7IS-vOHvHaSWp_HRiT, Timestamp 1520744795.927767, User HfxlCKx4uYhf09TF8fPITdNQtlo1
Key -L7IcTRvi0dL9HCPTiSE, Timestamp 1520747800.437907, User HfxlCKx4uYhf09TF8fPITdNQtlo1
Key -L7IdWlpJ8zLwI3YIvi7, Timestamp 1520748076.208767, User 2ul1ZpfLtxTv4KodiNBLUvKAcgo2
Key -L7IdboVraORS1-xTQMM, Timestamp 1520748100.956265, User 2ul1ZpfLtxTv4KodiNBLUvKAcgo2
Key -L7IgTX0XFbu9YC2mX6W, Timestamp 1520748849.399632, User 2ul1ZpfLtxTv4KodiNBLUvKAcgo2
Key -L7IvDLm1M9lmMJDmu5u, Timestamp 1520752715.24575, User 2ul1ZpfLtxTv4KodiNBLUvKAcgo2
Key -L7JOOepHWvxU6CbaEPO, Timestamp 1520760625.902419, User 2ul1ZpfLtxTv4KodiNBLUvKAcgo2
Key -L7JOS1zOsB9Tf0TCsOL, Timestamp 1520760639.73502, User 2ul1ZpfLtxTv4KodiNBLUvKAcgo2
Key -L7JWCQmnZhqmxC-vYqC, Timestamp 1520762672.943332, User 2ul1ZpfLtxTv4KodiNBLUvKAcgo2
Key -L7JhX9BImuv0DAtjeBN, Timestamp 1520765903.561222, User PQlpt0gStuNH5qICZFzTJYWrhjx1
Key -L7JhYbvMr-xvUCcZUdo, Timestamp 1520765909.560808, User PQlpt0gStuNH5qICZFzTJYWrhjx1
Key -L7KtGXoMUEgAorrfCDm, Timestamp 1520785758.446064, User PQlpt0gStuNH5qICZFzTJYWrhjx1
Key -L7KwK-VtU9vKtLg8F-x, Timestamp 1520786559.068727, User PQlpt0gStuNH5qICZFzTJYWrhjx1
Key -L7KwQRUpjEa9fDTLz3g, Timestamp 1520786585.436313, User PQlpt0gStuNH5qICZFzTJYWrhjx1
Key -L7Kwgo_XBLCjomFipQ5, Timestamp 1520786656.609396, User PQlpt0gStuNH5qICZFzTJYWrhjx1
Key -L7L-X5vy3THn_bfq7vM, Timestamp 1520787661.309544, User PQlpt0gStuNH5qICZFzTJYWrhjx1
Key -L7LcY7xebZPkIkmZ3dX, Timestamp 1520798151.346764, User PQlpt0gStuNH5qICZFzTJYWrhjx1
Key -L7NOP4oE8ezfD8XyXxs, Timestamp 1520827736.498612, User PQlpt0gStuNH5qICZFzTJYWrhjx1
Key -L7NOSlCNPTxTautJNOl, Timestamp 1520827751.563096, User PQlpt0gStuNH5qICZFzTJYWrhjx1
Key -L7NVUR_P1yu5GFgism5, Timestamp 1520829593.437312, User PQlpt0gStuNH5qICZFzTJYWrhjx1
Key -L7NZoYHvCeqXXUjOUZC, Timestamp 1520830728.45705, User PQlpt0gStuNH5qICZFzTJYWrhjx1
Key -L7NZv6K8EtI97ZRHOl7, Timestamp 1520830755.339643, User PQlpt0gStuNH5qICZFzTJYWrhjx1
Key -L7N_MvoCFV8nOszdcQn, Timestamp 1520830873.384209, User PQlpt0gStuNH5qICZFzTJYWrhjx1
Key -L7QBKRzDxu-SvGGDs8S, Timestamp 1520874641.275255, User PQlpt0gStuNH5qICZFzTJYWrhjx1
Key -L7QCQueKovJpOVhxEfR, Timestamp 1520874929.892702, User PQlpt0gStuNH5qICZFzTJYWrhjx1
User HfxlCKx4uYhf09TF8fPITdNQtlo1, Name dkkdd
User HfxlCKx4uYhf09TF8fPITdNQtlo1, Name dkkdd
User HfxlCKx4uYhf09TF8fPITdNQtlo1, Name dkkdd
User HfxlCKx4uYhf09TF8fPITdNQtlo1, Name dkkdd
User HfxlCKx4uYhf09TF8fPITdNQtlo1, Name dkkdd
User HfxlCKx4uYhf09TF8fPITdNQtlo1, Name dkkdd
User 2ul1ZpfLtxTv4KodiNBLUvKAcgo2, Name joeyhhh
User 2ul1ZpfLtxTv4KodiNBLUvKAcgo2, Name joeyhhh
User 2ul1ZpfLtxTv4KodiNBLUvKAcgo2, Name joeyhhh
User 2ul1ZpfLtxTv4KodiNBLUvKAcgo2, Name joeyhhh
User 2ul1ZpfLtxTv4KodiNBLUvKAcgo2, Name joeyhhh
User 2ul1ZpfLtxTv4KodiNBLUvKAcgo2, Name joeyhhh
User 2ul1ZpfLtxTv4KodiNBLUvKAcgo2, Name joeyhhh
User PQlpt0gStuNH5qICZFzTJYWrhjx1, Name dnndddmdmd
User PQlpt0gStuNH5qICZFzTJYWrhjx1, Name dnndddmdmd
User PQlpt0gStuNH5qICZFzTJYWrhjx1, Name dnndddmdmd
User PQlpt0gStuNH5qICZFzTJYWrhjx1, Name dnndddmdmd
User PQlpt0gStuNH5qICZFzTJYWrhjx1, Name dnndddmdmd
User PQlpt0gStuNH5qICZFzTJYWrhjx1, Name dnndddmdmd
User PQlpt0gStuNH5qICZFzTJYWrhjx1, Name dnndddmdmd
User PQlpt0gStuNH5qICZFzTJYWrhjx1, Name dnndddmdmd
User PQlpt0gStuNH5qICZFzTJYWrhjx1, Name dnndddmdmd
User PQlpt0gStuNH5qICZFzTJYWrhjx1, Name dnndddmdmd
User PQlpt0gStuNH5qICZFzTJYWrhjx1, Name dnndddmdmd
User PQlpt0gStuNH5qICZFzTJYWrhjx1, Name dnndddmdmd
User PQlpt0gStuNH5qICZFzTJYWrhjx1, Name dnndddmdmd
User PQlpt0gStuNH5qICZFzTJYWrhjx1, Name dnndddmdmd
User PQlpt0gStuNH5qICZFzTJYWrhjx1, Name dnndddmdmd
User PQlpt0gStuNH5qICZFzTJYWrhjx1, Name dnndddmdmd

This again looks fine to me, although I'd definitely recommend only loading each user once (and thus keep a map of users you've already recently loaded).

This:

databaseRef.child("Posts").queryOrdered(byChild: "Timestamp").observe(.value, with: { (snapshot) in

is correct, but in the database you have many TimeStamp with the same value, "Timestamp" : 1.520786656609396E9, that is why everytime you are getting a different order.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM