1

我是 Firestore 和学习 Android 的新手。我面临的问题是关于构建代码。以下是我的用例:

  1. 用户想要添加一个新的笔记,输入笔记的标题
  2. 我想检查是否存在任何其他具有相同标题的笔记
  3. 如果是,则不允许,否则创建

早些时候,使用 SQLite 很容易。我可以运行一个查询来获取列表中的数据,检查列表并采取相应的行动。

// BEFORE
private boolean fnValidate() {
    // some code...

    // run Sqlite query and get data in a list or something

    // check if exists, return accordingly
}

// NOW
private boolean fnValidate() {
    // some code...

    notesRef.get().addOnSuccessListener(queryDocumentSnapshots -> {
        for (QueryDocumentSnapshot s : queryDocumentSnapshots) {
            // add data to list or something
        }

        // 'exists logic' will go here??

    }).addOnFailureListener(e -> {
        // show error
    });

    // I want 'exists logic' here like it was earlier so that I can properly return true/false
}

现在如您所见,这不会以顺序方式工作。它将启动获取笔记的任务并继续进行。因此,我需要添加我exists logic的 in OnSuccessListener

此外,将来,如果我必须在 my 之前检查其他值exists logic,我将不得不再次exists logic进入该条件OnSuccessListener,依此类推。

另外,从哪里将值 true/false 返回给原始调用者fnValidate

也许我在这里遗漏了一些明显的东西,但我对理想的结构应该如何感到非常困惑。请告诉我这里的最佳做法是什么。

4

1 回答 1

1

因此,我需要在OnSuccessListener.

是的,当onSuccess()触发时,这意味着您 100% 确定从数据库中获取数据的操作是 100% 成功的,并且您可以根据需要使用该数据。您总是需要等待数据。

此外,将来,如果我必须在我的存在逻辑之前检查其他值,我将再次必须在该条件的 OnSuccessListener 等中移动存在逻辑。

是的,这就是异步编程的工作方式。

另外,从哪里将值 true/false 返回给原始调用者fnValidate

fnValidate作为方法的结果,您无法返回数据 ( )。有关有效的解决方案,请参阅我在以下帖子中的回答:

于 2020-04-03T12:17:36.323 回答