Scamparelli
Scamparelli

Reputation: 744

Add Map to JSON Object for Saving to Firestore

Can't see how to do this and getting rather confused!

I am saving 'site' objects to firestore, but I want to add a list of users associated to each site.

I have added a Map of users to my JSON object as below:

@IgnoreExtraProperties
data class SiteObject(
    var siteReference: String,
    var siteAddress: String,
    var sitePhoneNumber: String,
    var siteEmail: String,
    var invoiceAddress: String,
    var invoicePhoneNumber: String,
    var invoiceEmail: String,
    var website: String,
    var companyNumber: String,
    var vatNumber: String,

    var recentProjectsText: String,
    //not set up yet:
    var sitePriority: Boolean,
    var siteRating: Int,
    var plusCode: String,
    var users: Map<String, Boolean>?, // This is the map I have added


    @ServerTimestamp
    var dateCreatedTimestamp: Date?,
    @ServerTimestamp
    var dateEditedTimestamp: Date?,

    @Exclude
    var siteID: String?
) : Serializable {


    private constructor() : this(
        "",
        "",
        "",
        "",
        "",
        "",
        "",
        "",
        "",
        "",
        "",
        false,
        1,
        "",
        null,
        null,
        null,
        null
    )

    override fun toString(): String {
        return "$siteReference"
    }


}

And in my respository I am trying to add the current user to this list of users as below:

    // save sites to firebase
    fun saveSite(site: SiteObject) {
        site.users?.plus(Pair(firebaseUser?.uid.toString(), true)) // This is where I expected the user Id to be added to Map of users..
        val documentReference = firestore.collection("sites").document().set(site)
            .addOnCompleteListener {
                if(it.isSuccessful){
                    Log.d(TAG, "${site.toString()} saved")
                    lastOperationText.value = "New site, ${site.siteReference}, saved!"
                } else {
                    Log.d(TAG, "${site.toString()} saved")
                    lastOperationText.value = "Save new site failed"
                }
            }
    }

However, I still seeing null for users in the Firestore console.

Upvotes: 0

Views: 730

Answers (2)

Scamparelli
Scamparelli

Reputation: 744

For completeness, below is my updated data class. This initialises the values when it is created and also includes @Exclude @set:Exclude @get:Exclude on siteID to prevent this being saved to Firestore (used to store generated id when read from Firestore):

@IgnoreExtraProperties
data class SiteObject(
    var siteReference: String = "",
    var siteAddress: String = "",
    var sitePhoneNumber: String = "",
    var siteEmail: String = "",
    var invoiceAddress: String = "",
    var invoicePhoneNumber: String = "",
    var invoiceEmail: String = "",
    var website: String = "",
    var companyNumber: String = "",
    var vatNumber: String = "",
    var recentProjectsText: String = "",
    var sitePriority: Boolean = false,
    var siteRating: Int = 1,
    var plusCode: String = "",
    var users: HashMap<String, Boolean> = hashMapOf(),


    @ServerTimestamp
    var dateCreatedTimestamp: Date? = null,
    @ServerTimestamp
    var dateEditedTimestamp: Date? = null,

    @Exclude @set:Exclude @get:Exclude
    var siteID: String = ""
) : Serializable {

    override fun toString(): String {
        return "$siteReference, $siteAddress, $siteRating, $siteID"
    }

    fun siteDetailsText(): String {
        var siteDetailsText = siteAddress
        if (sitePhoneNumber.isNotEmpty()) siteDetailsText.plus("\n\n$sitePhoneNumber")
        if (website.isNotEmpty()) siteDetailsText.plus("\n\n$website")
        return siteDetailsText
    }

    fun invoiceDetailsText(): String {
        var invoiceDetailsText = invoiceAddress
        if (invoicePhoneNumber.isNotEmpty()) invoiceDetailsText.plus("\n\n$invoicePhoneNumber")
        if (companyNumber.isNotEmpty()) invoiceDetailsText.plus("\n\n$companyNumber")
        if (vatNumber.isNotEmpty()) invoiceDetailsText.plus("\n\n$vatNumber")
        return invoiceDetailsText
    }

}

Upvotes: 0

Doug Stevenson
Doug Stevenson

Reputation: 317497

Your code never gives an initial value to users. It starts off null. Since it doesn't get assigned a value, this code will not make a change to it, because it's first checking to see if users is null using the ?. operator:

site.users?.plus(Pair(firebaseUser?.uid.toString(), true))

You will need to assign it an initial value before trying to modify it. It should probably never be null and just start empty.

var users = HashMap<String, Boolean>()

Upvotes: 1

Related Questions