gpt4 book ai didi

android - Android Kotlin:如何从Firebase删除数据

转载 作者:行者123 更新时间:2023-12-02 13:15:31 25 4
gpt4 key购买 nike

我是Android Kotlin的新手。单击应用上的按钮时,我尝试从Cloud Firebase删除数据。我在适配器上做了一些必要的代码,但是如何在Activity上调用数据库集合? ı在下面分享了我的适配器和我的 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
}


}
这是我的 Activity 代码,我在此 Activity 中创建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。我通常通过在适配器或 Activity 中保留文档ID或 DocumentSnapshot对象的列表,然后按其位置/索引查找单击的项目来完成此操作。
因此,在 getDataFromFirestore函数中,将快照添加到您在 Activity 类中定义为字段的列表中:
// 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()
}

关于android - Android Kotlin:如何从Firebase删除数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64370610/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com