【发布时间】:2018-10-28 13:33:36
【问题描述】:
我正在尝试迭代 firebase-database 并将其元素添加到我的对象中。它有效,但由于某种原因我无法理解,它对每个元素进行两次广告,日志输出显示如下:
TAGZ: DataSnapshot { key = recipeHeaderFirebase, value = Tahini-Oat Cookies }
TAGZ: DataSnapshot { key = recipeHeaderFirebase, value = Tahini-Oat Cookies }
TAGZ: DataSnapshot { key = recipeHeaderFirebase, value = Chocolate & Cinnamon Cookies }
TAGZ: DataSnapshot { key = recipeHeaderFirebase, value = Chocolate & Cinnamon Cookies }
TAGZ: DataSnapshot { key = recipeHeaderFirebase, value = Sweet Potato Muffin }
TAGZ: DataSnapshot { key = recipeHeaderFirebase, value = Sweet Potato Muffin }
TAGZ: DataSnapshot { key = recipeHeaderFirebase, value = Almond Butter Cookies }
TAGZ: DataSnapshot { key = recipeHeaderFirebase, value = Almond Butter Cookies }
Firebase-database 结构如下所示(注意我暂时忽略了其他元素):
我的 Kotlin 代码如下所示:
fbdb = FirebaseDatabase.getInstance()
ref = fbdb!!.getReference("cookies")
ref!!.addChildEventListener(object: ChildEventListener {
override fun onChildAdded(snapshot: DataSnapshot?, p1: String?) {
val children = snapshot!!.children //DIRECT REFERENCE TO CHILD, USED FOR LOOP
val header = snapshot!!.child("recipeHeaderFirebase")
for(it in children) {
var tempRecipe = RecipeTemplate()
tempRecipe.recipeHeader = header.toString()
Log.d("TAGZ", tempRecipe.recipeHeader) //OUTPUT SHOWS DUPLICATE VALUES
}
}
})
我错过了什么?我使用类似的代码成功检索了 Xcode 中的元素...
编辑完整的代码请求:
package com.healthandchocolate.sjostedtafzelius.healthchocolateandroid
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import com.google.firebase.database.*
class RecipeGridView : AppCompatActivity() {
private var fbdb: FirebaseDatabase? = null
private var ref: DatabaseReference? = null
var recipeArray: MutableList<RecipeTemplate> = mutableListOf()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_recipe_grid_view)
Log.d("TAG", "ON CREATE");
fbdb = FirebaseDatabase.getInstance()
ref = fbdb!!.getReference("cookies")
ref!!.addChildEventListener(object: ChildEventListener {
override fun onChildChanged(snapshot: DataSnapshot?, p1: String?) {
}
override fun onChildMoved(p0: DataSnapshot?, p1: String?) {
Log.d("TAG", "ON CHILD MOVED");
}
override fun onChildRemoved(p0: DataSnapshot?) {
Log.d("TAG", "ON CHILD REMOVED");
}
override fun onCancelled(error: DatabaseError) {
print(error)
Log.d("TAG", "ON ERROR");
}
override fun onChildAdded(snapshot: DataSnapshot?, p1: String?) {
Log.d("TAGZ", "CALLED") //keyName of each child
val children = snapshot!!.children //DIRECT REFERENCE TO CHILD, USED FOR LOOP
val header = snapshot!!.child("recipeHeaderFirebase")
for(it in children) {
var tempRecipe = RecipeTemplate()
tempRecipe.recipeHeader = header.toString()
//Log.d("TAGZ", tempRecipe.recipeHeader) //keyName of each child
recipeArray.add(tempRecipe)
}
}
}) //END FB CODE
}
}
【问题讨论】:
-
事件监听器好像被调用了两次
-
@csblo 有吗?为何如此?在哪里?
-
你能发布更多你的代码吗?出现错误时您使用什么 IDE?
-
确实,onChildAdded() 被调用了两次,我的日志显示了。问题是为什么以及如何预防......
-
@csblo 我添加了完整的代码,但实际上并没有更多可显示的内容。使用 Android Studio。
标签: firebase for-loop firebase-realtime-database kotlin duplicates