为啥在使用 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】:传递给onDataChange
的dataSnapshot
始终包含节点上存在的完整数据。由于您处理了整个快照并将其添加到 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 时间戳?
如果使用“+”运算符添加列表,为啥 Kotlin 会将 List<List<Int>> 类型的列表更改为 List<Any>?
尝试使用 Kotlin 和 onActivityResult 将数据从 Fragment 发送到 Activity
我需要将当前日期与其他数据一起添加到 firebase Realtime 数据库,并在 kotlin android 中检索所有带有日期的数据