簡體   English   中英

Android Kotlin:如何從 Firebase 中刪除數據

[英]Android Kotlin: How can I delete the data from Firebase

我是 Android Kotlin 的新手。 當我單擊應用程序上的按鈕時,我嘗試從 Cloud Firebase 中刪除數據。 我在我的適配器上做了一些必要的代碼,但是我如何在我的 Activity 上調用數據庫集合? 我在下面分享了我的適配器和我的活動代碼。

class NoteAdapter(val titleText: ArrayList<String>, val rowImage: ArrayList<String>, val noteText: ArrayList<String>, val listener: onClick) : RecyclerView.Adapter<NoteAdapter.NoteHolder>() {


    interface onClick {

        fun onItemClickListener(v: View, pos: Int, data: Any)


    }


    class NoteHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

        val itemImage : ImageView = itemView.findViewById(R.id.recyclerImage)
        val itemDelete: ImageView = itemView.findViewById(R.id.delete)


    }


    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): NoteHolder {

        val v = LayoutInflater.from(parent.context).inflate(R.layout.recycler_row, parent, false)
        return NoteHolder(v)
    }

    override fun onBindViewHolder(holder: NoteHolder, position: Int) {

        holder.itemView.recyclerTitleText.text = titleText[position]
        Picasso.get().load(rowImage[position]).resize(150,150).into(holder.itemImage)

        holder.itemView.setOnClickListener {


            val intent = Intent(holder.itemView.context, PastNotesActivity:: class.java)
            intent.putExtra("oldTitle", titleText[position])
            intent.putExtra("oldNote", noteText[position])
            intent.putExtra("oldImage", rowImage[position])
            holder.itemView.context.startActivity(intent)


        }

        holder.itemDelete.setOnClickListener { v: View ->

            titleText.removeAt(position)
            noteText.removeAt(position)
            rowImage.removeAt(position)

            notifyItemRemoved(position)

            listener.onItemClickListener(v, position, holder.itemView)
        }

    }

    override fun getItemCount(): Int {

        return titleText.size
    }


    override fun getItemId(position: Int):Long  {
        return position.toLong()
    }

    override fun getItemViewType(position: Int):Int {
        return position
    }


}

這是我的活動代碼,我在此活動中創建了 itemDelete 樂趣,但如何在此樂趣中定義我的適配器代碼? 我試圖在我的文檔中寫“{id.data}”但沒有用我應該寫什么?

class ListViewActivity : AppCompatActivity() {

    var selectedPicture: Uri? = null

    private  lateinit var auth: FirebaseAuth
    private lateinit var db : FirebaseFirestore

    var titleTextFromFB : ArrayList<String> = ArrayList()
    var noteTextFromFB : ArrayList<String> = ArrayList()
    var imageFromFB : ArrayList<String> = ArrayList()


    var adapter: NoteAdapter? = null



    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_list_view)

        auth = FirebaseAuth.getInstance()
        db = FirebaseFirestore.getInstance()

        getDataFromFirestore()

        // recyclerview

        var layoutManager = LinearLayoutManager(this)
        recyclerView.layoutManager = layoutManager

       // adapter = NoteAdapter(titleTextFromFB, imageFromFB, noteTextFromFB)
        //recyclerView.adapter = adapter

        adapter = NoteAdapter(titleTextFromFB, imageFromFB, noteTextFromFB, object: NoteAdapter.onClick{

            override fun onItemClickListener(v: View, pos: Int, data: Any) {

                when(v.id){

                    R.id.delete -> itemDelete(data)

                }

            }

        })

        recyclerView.adapter = adapter

    }


    override fun onCreateOptionsMenu(menu: Menu?): Boolean {

        val menuInflater = menuInflater
        menuInflater.inflate(R.menu.add_note, menu)

        return super.onCreateOptionsMenu(menu)
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {

        if (item.itemId == R.id.add_note_click) {
            // Take Notes Activity
            val intent = Intent(applicationContext, TakeNotesActivity::class.java)
            intent.putExtra("info","new")
            startActivity(intent)

        } else if (item.itemId == R.id.log_out) {

            val alert = AlertDialog.Builder(this)

            alert.setTitle("Log Out")
            alert.setMessage("Are you sure to logout from the app ?")
            alert.setPositiveButton("Yes") {dialog, which ->

                auth.signOut()
                val intent = Intent(applicationContext, MainActivity::class.java)
                startActivity(intent)
                finish()
            }

            alert.setNegativeButton("No") {dialog, which ->

            }

            alert.show()

        }

        return super.onOptionsItemSelected(item)
    }

    // get data from firestore

    fun getDataFromFirestore() {

        db.collection("Notes").orderBy("date", Query.Direction.DESCENDING).addSnapshotListener{ snapshot, exception ->

            if (exception != null) {

                // If there is a error ,

                Toast.makeText(applicationContext, exception.localizedMessage.toString(), Toast.LENGTH_LONG).show()

            } else {

                if (snapshot != null) {

                    if (!snapshot.isEmpty) {

                        titleTextFromFB.clear()
                        noteTextFromFB.clear()
                        imageFromFB.clear()

                        val documents = snapshot.documents
                        for (document in documents) {

                            val userEmail = document.get("userEmail") as String
                            val noteTitle = document.get("noteTitle") as String
                            val yourNote = document.get("yourNote") as String
                            val downloadUrl = document.get("downloadUrl") as String
                            val timestamp = document.get("date") as Timestamp
                            val date = timestamp.toDate()

                            titleTextFromFB.add(noteTitle)
                            imageFromFB.add(downloadUrl)
                            noteTextFromFB.add(yourNote)

                            adapter!!.notifyDataSetChanged()

                        }
                    }
                }

            }


        }


    }

    fun itemDelete(data: Any) {

        db.collection("Notes").document().delete().addOnSuccessListener {


        }

            .addOnFailureListener { exception ->

                Toast.makeText(applicationContext, exception.localizedMessage.toString(), Toast.LENGTH_LONG).show()
            }
    }


}

此代碼將不起作用:

   db.collection("Notes").document().delete().addOnSuccessListener {

db.collection("Notes").document()調用創建對新文檔的引用,然后您將其刪除。 所以什么都不會發生。

您需要做的是確定用戶單擊的文檔的 ID,並將其傳遞到document(...)調用中。 這為您提供了對正確文檔的DocumentReference ,以便delete()調用將刪除該文檔。

確定用戶單擊的文檔 ID 的關鍵在於以下代碼:

adapter = NoteAdapter(titleTextFromFB, imageFromFB, noteTextFromFB, object: NoteAdapter.onClick{
    override fun onItemClickListener(v: View, pos: Int, data: Any) {
        when(v.id){
            R.id.delete -> itemDelete(data)
        }
    }
})

您需要根據以下參數之一確定 ID: vpostdata 我通常通過在我的適配器或活動中保留文檔 ID 或DocumentSnapshot對象的列表來完成此操作,然后按其位置/索引查找單擊的項目。

因此,在您的getDataFromFirestore函數中,將快照添加到您在活動類中定義為字段的列表中:

// in your activity, declare a list;
var mDocuments: List<DocumentSnapshot>? = null

// Then in getDataFromFirestore store that list
...
mDocuments = snapshot.documents;
val documents = snapshot.documents
for (document in documents) {
    ...
}
...

// And use it when calling itemDelete:
adapter = NoteAdapter(titleTextFromFB, imageFromFB, noteTextFromFB, object: NoteAdapter.onClick{
    override fun onItemClickListener(v: View, pos: Int, data: Any) {
        when(v.id){
            R.id.delete -> itemDelete(mDocuments[pos])
        }
    }
})

// To then finally delete the document by its ID
fun itemDelete(doc: DocumentSnapshot) {
    db.collection("Notes").document(doc.Id).delete()
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM