Firebase: как управлять изменениями пользовательского интерфейса при записи в очередь? - PullRequest
0 голосов
/ 06 января 2019

Я использую базу данных Firebase в реальном времени в своем приложении для Android, где включено сохранение диска.

Когда пользователь открывает приложение в первый раз, когда я читаю статус авторизации, если это значение равно NULL, я показываю экран входа в систему, и после входа в систему я получаю username, сохраненный для этого идентификатора пользователя в базе данных в реальном времени.

Если имя пользователя равно нулю, я покажу экран настройки username, где он выберет для него уникальный username. Проблема возникает, когда соединение прерывается на этапе настройки имени пользователя. username еще не записан в базу данных, но когда он откроет приложение в следующий раз, username не будет нулевым, поскольку база данных в реальном времени дает мне значение, хранящееся в кэше. Итак, я перехожу на домашний экран, но что если кто-то еще выберет то же имя пользователя на этом этапе?

Я поддерживаю двустороннее сопоставление между uid и username, как предлагается в этом ответе

Я не могу использовать транзакцию, потому что за один раз транзакция может быть выполнена только по одному пути, но в моем случае мне нужно автоматически обновить два пути.

У меня также настроены правила безопасности для поддержания уникального имени пользователя, но что делать с пользователями, которые уже перешли экран настройки имени пользователя.

1 Ответ

0 голосов
/ 06 января 2019

Что если кто-то еще выберет то же имя пользователя на этом этапе?

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

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
Query query = rootRef.child("users").orderByChild("userName").equalTo(userName);
query.addValueEventListener(/* ... */);

Таким образом, если пользователь пытается установить / изменить имя пользователя в автономном режиме, указанный выше запрос добавляется в очередь. Как только пользователь восстановит соединение, все изменения, сделанные в автономном режиме, будут обновляться на серверах Firebase. Другими словами, вышеуказанный запрос будет зафиксирован на сервере. Поэтому, если пользователь выбирает имя пользователя, которое уже существует в базе данных в автономном режиме, когда он снова в сети, он получит сообщение о том, что имя пользователя уже существует.

Я не могу использовать транзакцию, потому что за один раз транзакция может быть выполнена только по одному пути, но в моем случае мне нужно автоматически обновить два пути.

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

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