Android 为什么在使用kotlin向firebase实时数据库添加数据时会得到重复值?
我试图显示用户发送到数据库的数据,但每当向数据库添加新数据时,它都会显示数据库中已有数据的副本,如下所示: 在添加新值之前: 在我添加单词“Apple”并将其发送到数据库后,我看到以下内容: 如果我关闭应用程序并重新打开或刷新页面,我只会得到我想要的树条目,如下所示: 这是我将每个条目添加到数据库的代码: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
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) {
...
}
}