将地图添加到JSON对象以保存到Firestore

时间:2020-05-18 15:49:36

标签: android kotlin google-cloud-firestore

看不到该怎么做,变得很困惑!

我正在将“站点”对象保存到Firestore,但是我想添加与每个站点关联的用户列表。

我已将用户映射添加到我的JSON对象中,如下所示:

@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"
    }


}

在我的存储库中,我尝试将当前用户添加到该用户列表中,如下所示:

    // 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"
                }
            }
    }

但是,我仍然在Firestore控制台中看到用户为null。

2 个答案:

答案 0 :(得分:1)

您的代码永远不会为users赋予初始值。它从null开始。由于未分配值,因此该代码不会对其进行更改,因为它首先使用?.运算符检查用户是否为空:

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

在尝试修改它之前,您需要为其分配一个初始值。它可能永远不会为空,而应该开始为空。

var users = HashMap<String, Boolean>()

答案 1 :(得分:0)

为完整性起见,以下是我更新的数据类。这样会在创建值时对其进行初始化,并在@Exclude @set:Exclude @get:Exclude上包含siteID,以防止将其保存到Firestore(用于从Firestore读取时存储生成的ID):

@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
    }

}