【问题标题】:Firebase + Kotlin, Find Document ID & Delete Document with IDFirebase + Kotlin,查找文档 ID 并删除带有 ID 的文档
【发布时间】:2020-11-25 11:42:17
【问题描述】:

我目前正在尝试在使用 Firebase 的 Firestore 的应用中创建“删除文档”功能。

我正在使用带有硬编码值的以下代码:

fun deleteEvent() {
    db.collection("events").document("4vom6RfWU9depGXR0Zw0")
        .delete()
}

此函数删除 ID 为“4vom6RfWU9depGXR0Zw0”的文档

我想要代替硬编码值的方法当然是找到相关文档 ID 并将其放入我可以使用的值中?

我已经在文档和 youtube/google 上搜索了我可以使用的代码,但其中大部分似乎已经过时或根本不再工作了。

我找到了几种方法,可用于查找文档“路径”和“ID”,但这些值与 Firebase UI 中显示的值不同,不能用于删除文档。

如果您需要更多信息,我们将不胜感激!

【问题讨论】:

  • a method that finds the relevant document ID 怎么样?那会是什么查询?你已经有文件了吗?如果是这样,那么你知道 id

标签: android firebase kotlin google-cloud-firestore


【解决方案1】:

我想要代替硬编码值的方法当然是找到相关文档 ID 并将其放入我可以使用的值中。

要通过文档 ID (4vom6RfWU9depGXR0Zw0) 删除文档,您应该将 ID 添加为文档的属性。

Firestore-root
  |
  --- events (collection)
       |
       --- 4vom6RfWU9depGXR0Zw0 (document)
              |
              --- docId: "4vom6RfWU9depGXR0Zw0"
              |
              --- //The other properties

现在要查找该特定文档,您需要使用如下所示的查询:

val rootRef: FirebaseFirestore = FirebaseFirestore.getInstance()
val eventsRef: CollectionReference = rootRef.collection("events")
val docIdQuery: Query = eventsRef.whereEqualTo("docId", "4vom6RfWU9depGXR0Zw0")
docIdQuery.get().addOnCompleteListener(object : OnCompleteListener<QuerySnapshot?>() {
    fun onComplete(task: Task<QuerySnapshot?>) {
        if (task.isSuccessful()) {
            for (document in task.getResult()) {
                document.getReference().delete().addOnSuccessListener(object : OnSuccessListener<Void?>() {
                    fun onSuccess(aVoid: Void?) {
                        Log.d(TAG, "Document successfully deleted!")
                    }
                }).addOnFailureListener(object : OnFailureListener() {
                    fun onFailure(e: Exception) {
                        Log.w(TAG, "Error deleting document", e)
                    }
                })
            }
        } else {
            Log.d(TAG, "Error getting documents: ", task.getException()) //Don't ignore potential errors!
        }
    }
})

对于 Java 用户:

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference eventsRef = rootRef.collection("events");
Query docIdQuery = eventsRef.whereEqualTo("docId", "4vom6RfWU9depGXR0Zw0");
docIdQuery.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
    @Override
    public void onComplete(@NonNull Task<QuerySnapshot> task) {
        if (task.isSuccessful()) {
            for (QueryDocumentSnapshot document : task.getResult()) {
                document.getReference().delete().addOnSuccessListener(new OnSuccessListener<Void>() {
                    @Override
                    public void onSuccess(Void aVoid) {
                        Log.d(TAG, "Document successfully deleted!");
                    }
                }).addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Log.w(TAG, "Error deleting document", e);
                    }
                });
            }
        } else {
            Log.d(TAG, "Error getting documents: ", task.getException()); //Don't ignore potential errors!
        }
    }
});

但是,如果您想删除一个将 date 属性的值设置为“2020 年 11 月 25 日”的文档,则此代码将起作用。在这种情况下,应使用以下查询:

Query dateQuery = eventsRef.whereEqualTo("date", "25 Nov 2020");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 2021-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多