【问题标题】:How to get past push() generated keys so I can update or remove it in kotlin?如何获取过去 push() 生成的密钥,以便我可以在 kotlin 中更新或删除它?
【发布时间】:2020-12-01 07:00:31
【问题描述】:

这是我在 Firebase 实时数据库中的结构。我的问题是我无法通过这些唯一键,因此我可以使用 Kotlin 在我的应用程序中使用相应按钮更新或删除值。

我已尝试使用此代码,但没有任何反应。 我做错了什么?

 private fun deleteData() {
        val key = FirebaseDatabase.getInstance().reference.child("Utfordringer").push().key ?: return

        FirebaseDatabase.getInstance().getReference("Utfordringer")
            .child("$key")
            .child("kategori")
            .child("utfordring")
            .removeValue()

【问题讨论】:

  • 代码sn-p生成一个唯一键,然后删除了一个它一开始就没有创建的节点。从sn-p代码中并不清楚你想做什么。
  • 这可能是对的。我正在尝试获取对“分类”和“utfordring”的引用,以便更新或删除它。
  • 嘿!对不起,我正忙着准备考试。但是,是的,我会接受的。谢谢! :)

标签: android kotlin firebase-realtime-database


【解决方案1】:

为什么您当前的代码不起作用:当您调用 FirebaseDatabase.getInstance().reference.child("Utfordringer") 时,您正在生成一个新密钥。由于该键在数据库中尚不存在,因此不会删除任何数据。相反,您需要知道节点的现有键才能删除其下的数据。


Doug 方法的替代方案:如果您从 UI 中为现有节点调用 deleteData,您将希望保留节点的密钥也可用。

例如:假设您从数据库加载Utfordringer,您循环它们并将它们的utfordringkategori 添加到UI。此时,您还需要保留每个 Utfordringer 子节点的 key,以便在用户单击它时将其与 UI 元素相关联。

一种常见的方法是保留键和值的列表,或数据库中的单个快照列表:

val ref = FirebaseDatabase.getInstance().reference.child("Utfordringer")
val list = arrayListOf<DataSnapshot>()
ref.addValueEventListener(object : ValueEventListener {
    override fun onDataChange(dataSnapshot: DataSnapshot) {
        for (snapshot in dataSnapshot.children) {
            list.add(snapshot)
        }
    }

    override fun onCancelled(databaseError: DatabaseError) {
        // Getting Post failed, log a message
        Log.w(TAG, "loadPost:onCancelled", databaseError.toException())
        // ...
    }
})

现在,list 包含来自数据库的快照,您可以使用它在 UI 中显示它们(使用适配器)以便稍后在需要时查找它们。因此,当用户现在在 UI 中单击一个项目,并且您知道他们单击的项目的位置时,您可以在数据库中查找并删除相应的 Utfordringer 子节点:

let positionClicked = 3
let snapshotClicked = list[positionClicked]
let keyClicked = snapshotClicked.key
FirebaseDatabase.getInstance().getReference("Utfordringer")
            .child(keyClicked)
            .removeValue()

【讨论】:

    【解决方案2】:

    您不能“越过”子键。并且 T=实时数据库中没有通配符。如果要删除节点,则必须能够构建该节点的完整路径,并在该路径中包含所有子键名称。如果不知道路径中的某个子节点,则无法删除。

    听起来你会找到某种方法来找到你正在寻找的孩子,也许是通过查询,然后在你知道那个孩子的名字后将其删除。

    【讨论】:

    • 我可能写错了。我只想访问子类和 utfordring,以便我可以使用 updateChildren() 或 removeValue() 更新它们。
    • 正如我所说,您必须进行查询以找到子节点的名称,然后使用它来删除它。
    猜你喜欢
    • 1970-01-01
    • 2018-04-04
    • 2021-01-31
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-13
    相关资源
    最近更新 更多