Firestore: создание документа с указанным UID, в конце концов с set (), но без обновления полей - PullRequest
0 голосов
/ 07 июля 2019

Рассмотрим эти строки:

        Map<String, Object> the_data = new HashMap<>();
        the_data.put("login", "Anonymous");
        the_data.put("avatar_is_defined", false);
        the_data.put("amount", 0.0);
        the_data.put("deleted", false);
        the_data.put("can_read_user", true);
        Toast.makeText(this, "Initializing your data... Please wait until the screen appears.", Toast.LENGTH_SHORT).show();
        user_database_model.getReferenceToUser(signed_in_user_uid).set(the_data, SetOptions.mergeFields("")).addOnCompleteList[...]

При первом входе в систему пользователь должен выполнить этот вызов set, и все эти поля должны быть фактически установлены в документе, UID которого равен signed_in_user_uid.

Но, если пользователь снова выполняет вход (, т. Е .: документ уже существует), этот set либо должен игнорироваться (не выполняться) (в действительности это невозможно, см. Последний абзац), или его поля не должны быть обновлены (вот почему я неудачно намеревался написать SetOptions.mergeFields("")).

Можно ли вызвать функцию set, сообщающую: «Firestore, пожалуйста, создайте этот документ и заполните его предоставленными полями, если он не существует; но если он уже существует, просто ... не делайте» ничего не делать "?

Важно: из-за правил безопасности Firestore я не могу get() документ узнать, существует он или нет. (в обратном вызове я бы позвонил set, только если он не существует). Поэтому избежать вызова set (не выполняя его) невозможно в реальности.

1 Ответ

1 голос
/ 07 июля 2019

Если вы хотите, чтобы пользователь мог создать свой документ только один раз и никогда не обновлять его, вы можете сделать это в правилах безопасности с помощью:

service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{uid} {
      // Applies to writes to nonexistent documents
      allow create: if request.auth.uid != null;

      // Reject writes to existing documents
      allow update: if false;    
    }
  }
}

Если вы хотите, чтобы код на стороне клиентаопределите, существует ли документ, и создайте его, если его нет, используйте транзакцию .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...