nutella_eater
nutella_eater

Reputation: 3582

Preset object Id when pushing to Firebase

I'm using a SortedList to sort my items inside the RecyclerView. So I need to compare them by some unique Id, and Firebase provides awesome generated keys for that.

To push new value to a database I need to run:

public void addAdvert(Advert advert, String userId) {
        String id = reference.child(NODE_USERS)
        .child(userId)
        .child(NODE_ITEMS)
        .push()
        .getKey()   //execute this to just get the id

        advert.setId(id);
        getCurrentItemNode().child(advert.getId()).setValue(advert);

}

now my Advert item in database is fully equiped with Id and node key.

But I' curious, can I just write something like

reference.child(NODE_USERS)
            .child(userId)
            .child(NODE_ITEMS).push().setValue(advert); 

And achieve the same result: both key and ID are set in database.

Upvotes: 0

Views: 740

Answers (1)

Frank van Puffelen
Frank van Puffelen

Reputation: 598775

If you want to store the key in the item, you'll either have to perform two write operations or first generate the key and then write it.

But why do you want to store the key in the item to begin with?

As a side note, this code:

    String id = reference.child(NODE_USERS)
    .child(userId)
    .child(NODE_ITEMS)
    .push()
    .getKey()

Is exactly the same as this:

    String id = reference.push().getKey()

Firebase's push IDs are client-side generated, statistically guaranteed to be unique values. They're not dependent on the path and there is no round-trip to the database needed to determine these values.

See this blog post for more information: The 2^120 Ways to Ensure Unique Identifiers.

Upvotes: 1

Related Questions