Android 为什么在使用kotlin向firebase实时数据库添加数据时会得到重复值?

Android 为什么在使用kotlin向firebase实时数据库添加数据时会得到重复值?,android,firebase,kotlin,firebase-realtime-database,Android,Firebase,Kotlin,Firebase Realtime Database,我试图显示用户发送到数据库的数据,但每当向数据库添加新数据时,它都会显示数据库中已有数据的副本,如下所示: 在添加新值之前: 在我添加单词“Apple”并将其发送到数据库后,我看到以下内容: 如果我关闭应用程序并重新打开或刷新页面,我只会得到我想要的树条目,如下所示: 这是我将每个条目添加到数据库的代码: val myRef = database.getReference("User-following").child(currentUid!!) priva

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

在添加新值之前:

在我添加单词“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())
        }
    })
}
这是我从数据库中提取数据的代码:

    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())
        }
    })
}

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

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

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