为啥在使用 kotlin 将数据添加到 firebase 实时数据库时会得到重复值?

Posted

技术标签:

【中文标题】为啥在使用 kotlin 将数据添加到 firebase 实时数据库时会得到重复值?【英文标题】:Why do i get duplicate values when adding data to firebase realtime database using kotlin?为什么在使用 kotlin 将数据添加到 firebase 实时数据库时会得到重复值? 【发布时间】:2021-02-28 04:22:44 【问题描述】:

我试图显示用户发送到数据库的数据,但是每当将新数据添加到数据库时,它都会显示数据库中已有数据的副本,如下所示:

在我添加新值之前:

添加单词“Apple”并将其发送到数据库后,我看到以下内容:

如果我关闭应用程序并重新打开或刷新页面,我只会得到我想要的树条目:

这是我将每个条目添加到数据库的代码:

    val myRef = database.getReference("User-following").child(currentUid!!)


private fun addCategory() 
    val newCategory = category.text.toString().trim()
    val isValid = validateCategory(newCategory)

    if (isValid) 

        val exists = checkIfCategoryExists(newCategory)

        if (!exists) 
        dismissKeyBoard()
        categorysList.add(newCategory)
        category.text.clear()
        Toast.makeText(this,
            "$newCategory has been added to your list",
            Toast.LENGTH_LONG).show()
        sendDataToDatabase(newCategory)
             else 
                category.error = "$newCategory has already been added"
            
    

这是我从数据库中提取数据的代码:

private fun fetchUsersFollowing() 


    myRef.addValueEventListener(object : ValueEventListener 
        override fun onDataChange(dataSnapshot: DataSnapshot) 
            for( childSnapshot in dataSnapshot.children) 
                if (!childSnapshot.hasChildren()) 
                    var test = childSnapshot.getValue()
                    val myCategory = CategoryModel()
                    myCategory.setCategories(test.toString())
                    list.add(myCategory)
                 else 
                    val noCategory = CategoryModel()
                    noCategory.setCategories("No Categories added.")
                    list.add(noCategory)
                    return
                
            
        

        override fun onCancelled(error: DatabaseError) 
            Log.e("Database Error", error.toString())
        
    )

【问题讨论】:

【参考方案1】:

传递给onDataChangedataSnapshot 始终包含节点上存在的完整数据。由于您处理了整个快照并将其添加到 list,因此随着时间的推移,您的列表最终会出现重复、三次等。

最简单的解决方案是每次调用onDataChange 时清除列表:

myRef.addValueEventListener(object : ValueEventListener 
    override fun onDataChange(dataSnapshot: DataSnapshot) 
        list.clear();
        for( childSnapshot in dataSnapshot.children) 
            ...
        
    

【讨论】:

以上是关于为啥在使用 kotlin 将数据添加到 firebase 实时数据库时会得到重复值?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Kotlin 插件为 Android 项目添加 kotlin-stdlib-jre7(不是 kotlin-stdlib)参考

将数据类的对象添加到 Kotlin 的 Firestore 时如何添加 Firebase 时间戳?

如何将 java 库添加到 kotlin 本机

如果使用“+”运算符添加列表,为啥 Kotlin 会将 List<List<Int>> 类型的列表更改为 List<Any>?

尝试使用 Kotlin 和 onActivityResult 将数据从 Fragment 发送到 Activity

我需要将当前日期与其他数据一起添加到 firebase Realtime 数据库,并在 kotlin android 中检索所有带有日期的数据