【问题标题】:I'm confused with push() method in Firebase Realtime Database? Android Kotlin我对 Firebase 实时数据库中的 push() 方法感到困惑?安卓科特林
【发布时间】:2021-05-05 18:37:57
【问题描述】:

我正在尝试将数据附加到我的 Firebase 实时数据库中的列表。文档说要使用 push() 方法,但并没有真正详细说明如何使用它以及它的示例。所以这是我的 MainActivity。有一个 EditText 我在其中输入了一个名称,然后当我单击写入按钮时,我想将编辑文本存储到数据库中并添加它们。我怎样才能做到这一点?到目前为止,这是我拥有的代码。我该如何解决这个问题?

class MainActivity : AppCompatActivity() {

    companion object {
        private var TAG = MainActivity::class.java.simpleName
    }

    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        val database = Firebase.database.reference

        val editText = binding.userInput
        val writeBtn = binding.writeUserButton

        val listOfNames = arrayListOf<String>()

        writeBtn.setOnClickListener{
            database.child("name").push()
            database.child("name").setValue(editText.text.toString())

            val childEventListener = object : ChildEventListener {
                override fun onChildAdded(snapshot: DataSnapshot, previousChildName: String?) {
                    listOfNames.add(snapshot.value.toString())
                }

                override fun onChildChanged(snapshot: DataSnapshot, previousChildName: String?) {
                    TODO("Not yet implemented")
                }

                override fun onChildRemoved(snapshot: DataSnapshot) {
                    TODO("Not yet implemented")
                }

                override fun onChildMoved(snapshot: DataSnapshot, previousChildName: String?) {
                    TODO("Not yet implemented")
                }

                override fun onCancelled(error: DatabaseError) {
                    TODO("Not yet implemented")
                }
        }
        }

    }
}

【问题讨论】:

    标签: android firebase kotlin firebase-realtime-database


    【解决方案1】:

    引用 push()

    private fun writeNewPost(userId: String, username: String, title: String, body: String) {
    // Create new post at /user-posts/$userid/$postid and at
    // /posts/$postid simultaneously
    val key = database.child("posts").push().key
    if (key == null) {
        Log.w(TAG, "Couldn't get push key for posts")
        return
    }
    
    val post = Post(userId, username, title, body)
    val postValues = post.toMap()
    
    val childUpdates = hashMapOf<String, Any>(
            "/posts/$key" to postValues,
            "/user-posts/$userId/$key" to postValues
    )
    
    database.updateChildren(childUpdates)
    }
    

    我认为这里的代码意味着您应该通过 push().key 获取推送关键点 之后,您可以获取密钥路径并上传值。我不知道如何用 kotlin 编码。

    在java中,它可能与此代码一起工作

    String key = mDatabase.child("name").push().getKey();
    database.child("/name/"+key).setValue(editText.text.toString())
    

    【讨论】:

      【解决方案2】:

      当您使用以下代码行时:

      database.child("name").push()
      

      这意味着您正在获得对“名称”属性的引用,然后立即生成一个新密钥。这就是push() 方法的作用,每次调用它都会生成一个新的随机密钥。你在用这条线做什么:

      database.child("name").setValue(editText.text.toString())
      

      您将获得指向完全相同“名称”属性的相同引用,并且您将 EditText 中的文本写入数据库。这意味着没有涉及推送的 ID。

      现在,如果要使用“push()”方法提供的生成密钥将多个名称写入数据库,则需要将该密钥添加到引用中。这可以通过简单地将其保存到变量中并像这样使用它来完成:

      val namesRef = database.child("names")
      val key = namesRef.push().key
      namesRef.child(key).child("name").setValue(editText.text.toString())
      

      您的数据库架构将如下所示:

      Firebase-root
         |
         --- names
              |
              --- $pushedId
                    |
                    --- name: "NameFromEditText"
      

      【讨论】:

      • 嗨,布赖恩!我可以帮助您了解其他信息吗?如果您认为我的回答对您有所帮助,请考虑通过单击左侧投票箭头下方的复选标记(✔️)来接受它。应将颜色更改为绿色。我真的很感激。谢谢!
      猜你喜欢
      • 1970-01-01
      • 2022-07-05
      • 2019-01-08
      • 1970-01-01
      • 2013-07-28
      • 1970-01-01
      • 2013-07-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多