【问题标题】:Random document that doesnt exist in firestore gets selected on android and deletedFirestore 中不存在的随机文档在 android 上被选中并被删除
【发布时间】:2020-05-01 12:00:30
【问题描述】:

我正在尝试从 Firestore 中删除一个文档。我正在尝试根据 Firestone 随机生成的任务 ID 来执行此操作。当在 android 上选择特定任务时,我希望能够删除该任务。但是,当我尝试调试代码时,它会显示数据库中不存在的随机 ID,并尝试删除它,并在控制台中向我发送成功消息。我不确定我哪里出错了。请指教。

 public void deleteTasks(View v) {
    userId = mFirebaseAuth.getCurrentUser().getUid();
    String tskid= fStore.collection("usersData").document(userId).collection("tasks").document().getId();
    DocumentReference taskref = fStore.collection("usersData").document(userId).collection("tasks").document(tskid);
    taskref.delete().addOnCompleteListener(new OnCompleteListener<Void>() {
        @Override
        public void onComplete(@NonNull Task<Void> task) {
            Log.d("tag", "Task Deleted Successfully");
        }
    }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            Log.d("tag", "Task Deletion Unsuccessful");
        }
    });
}

上面的delete方法是在按钮上使用android:OnClick调用的

The Task I'd like to delete is Circled

【问题讨论】:

  • 请编辑您的问题并将您的数据库结构添加为屏幕截图并指明您要删除的确切任务。
  • @AlexMamo,已经更新了,我要删除的任务被圈出来了

标签: android firebase google-cloud-firestore


【解决方案1】:

当您使用以下代码行时:

String tskid= fStore.collection("usersData").document(userId)
    .collection("tasks").document()
    .getId();

您正在生成一个随机 ID。实际上,您正在为将来要编写的文档保留密钥。使用此行时:

DocumentReference taskref = fStore.collection("usersData").document(userId)
    .collection("tasks").document(tskid);

您正在创建对该位置的引用。但是,当使用这一行时:

taskref.delete().addOnCompleteListener(/* ... */);

您正在尝试删除一个不存在的文档,这是因为您一开始没有创建它。如果您需要删除特定文档,则需要知道 ID。所以下面几行代码就可以解决问题:

 public void deleteTasks(View v) {
    userId = mFirebaseAuth.getCurrentUser().getUid();
    String tskid = "CQ45RKh8Ohd6DXjSQ8RO";
    DocumentReference taskref = fStore.collection("usersData").document(userId)
            .collection("tasks").document(tskid);
    taskref.delete().addOnCompleteListener(new OnCompleteListener<Void>() {
        @Override
        public void onComplete(@NonNull Task<Void> task) {
            Log.d("tag", "Task Deleted Successfully");
        }
    }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            Log.d("tag", "Task Deletion Unsuccessful");
        }
    });
}

为了删除该文档,我使用了数据库中存在的完全相同的 ID。

【讨论】:

  • 这里的 ID 是硬编码的,我想知道在我的应用程序中,当我选择特定任务时,(它可能是列表中的任何任务)的 ID执行任务,然后仅删除该任务
  • 在这种情况下,您应该为每个 Task 对象存储该 ID,以便将来可以将其用于删除操作。另一种方法是创建一个与您的确切文档匹配的查询,例如db.collection("tasks").whereEqualTo("taskName", "YourTaskToDelete"),然后获取该文档的 id 并执行删除操作,如我的回答中所述。试一试,告诉我它是否有效。
  • 我已经在“TaskList”类中​​为 taskID 创建了一个对象。我也有它的 setter 和 getter。但是由于我对android和java很陌生,我不确定如何调用它来删除部分
  • 执行删除操作时,需要有要删除的文档的id。因此,查询数据库以仅获取您需要删除的文档,附加一个侦听器,获取 id,然后将该值简单地分配给tskid,就像我的回答一样。
  • 我尝试了您提到的代码,但出现错误。我已将 public void deleteTasks(View v) 添加为 deleteButton 的 onclick。但它抛出了控制台中显示的错误。我已经更新了代码并错误地抛出了它。请看一下
猜你喜欢
  • 2021-06-26
  • 1970-01-01
  • 1970-01-01
  • 2021-10-17
  • 2020-01-03
  • 1970-01-01
  • 1970-01-01
  • 2020-10-28
相关资源
最近更新 更多