我在启用了磁盘持久性的Android应用中使用Firebase实时数据库。
当用户首次打开应用程序时,我读取身份验证状态,如果为空,则显示登录屏幕,登录后,我将获得针对该用户ID的username
存储在实时数据库中。
如果用户名为空,那么我将显示username
设置屏幕,其中他将为他选择唯一的username
。在用户名设置阶段连接断开时会出现问题。 username
尚未写入数据库,但是当他下次打开应用程序时,username
不会为null,因为实时数据库为我提供了存储在缓存中的值。因此,我进入主屏幕,但是如果在此阶段其他人选择了相同的用户名怎么办?
按照此answer的建议,我在uid
和username
之间保持双向映射
我不能使用事务,因为一次交易只能在一条路径上运行,但就我而言,我必须自动更新两条路径。
我还设置了安全规则,以维护唯一的用户名,但是如何处理已经越过用户名设置屏幕的用户呢?
答案 0 :(得分:0)
如果在此阶段其他人选择了相同的用户名怎么办?
每次要对用户名执行写操作时,都需要确保其唯一性。要检查是否有user name exists in a Firebase realtime database,需要这样的查询:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
Query query = rootRef.child("users").orderByChild("userName").equalTo(userName);
query.addValueEventListener(/* ... */);
因此,如果用户在脱机时尝试设置/更改用户名,则上述查询将添加到队列中。一旦用户重新建立连接,脱机时所做的每个更改都将在Firebase服务器上更新。换句话说,以上查询将在服务器上提交。因此,如果用户选择了脱机时数据库中已经存在的用户名,那么当其重新联机时,他会收到一条消息,提示该用户名已经存在。
我不能使用事务,因为一次交易只能在一条路径上运行,但就我而言,我必须自动更新两条路径。
我不能使用事务,因为它只能在一条路径上运行,根本不能使用事务。不支持离线使用交易。这是因为事务绝对需要与服务器进行往返通信,以确保事务内的代码成功完成。因此,交易只能在您在线时执行。