kotlin 我如何像在图像中那样添加集合到Firestore数据库?

yshpjwxd  于 2023-02-16  发布在  Kotlin
关注(0)|答案(2)|浏览(129)

我想将集合添加到Firestore数据库,如下图所示:
here
我想在每次调用函数时在数组列表中添加一个符号。

fun addsymbol(){
    val arrayList= arrayListOf<String>()
    arrayList.add(Coin.Coin_Info?.symbol!!)
    val postHashMap = hashMapOf<String, Any>()
    postHashMap.put("symbols",arrayList)

    Firestore.collection("Users").document("User1").set(postHashMap, SetOptions.merge())
        .addOnCompleteListener { task->
        if(task.isSuccessful){
            System.out.println("Succes  ")
        }
    }.addOnFailureListener {
        System.out.println( it.message.toString())
    }

}

函数工作,但它不是添加符号到数组列表,它是更新数组列表。我该如何解决它?

pjngdqdw

pjngdqdw1#

添加新符号时不需要读取文档中的数组,只需将FieldValue#arrayUnion()作为参数传递给update方法,如下所示:

Firestore.collection("Users").document("User1").update("symbols", FieldValue.arrayUnion(Coin.Coin_Info?.symbol!!))

我还建议附加一个完整的监听器,看看是否出了问题。

ugmeyewa

ugmeyewa2#

问题在于,每次调用addsymbol函数时,您都在创建arrayList的新示例,然后向其添加符号。但是,您没有从Firestore数据库中检索现有符号数组并向其追加新符号。要解决此问题,您需要检索现有符号数组,向其追加新符号,然后使用新阵列更新Firestore数据库。
请尝试以下操作:

fun addsymbol(){
    Firestore.collection("User").document("Userid").get()
        .addOnSuccessListener { documentSnapshot ->
            if (documentSnapshot.exists()) {
                val symbols = documentSnapshot.get("symbols") as ArrayList<String>
                symbols.add(Coin.Coin_Info?.symbol!!)

                val postHashMap = hashMapOf<String, Any>()
                postHashMap.put("symbols", symbols)

                Firestore.collection("User").document("Userid").set(postHashMap, SetOptions.merge())
                    .addOnCompleteListener { task ->
                        if (task.isSuccessful) {
                            System.out.println("Success")
                        }
                    }.addOnFailureListener {
                        System.out.println(it.message.toString())
                    }
            } else {
                System.out.println("Document does not exist")
            }
        }
        .addOnFailureListener {
            System.out.println(it.message.toString())
        }
}

相关问题