在Android上将对象保存到Firebase时“中止交易”

Luk*_*uke 5 android transactions runtime-error firebase

我遇到了一些代码的问题,这些代码直到今天还可以正常工作。基本上,我在身份验证后执行标准创建用户对象以获取额外的数据。

但是,当我只测试下面的代码时,它不再输入onComplete方法。相反,我在下面的日志中看到有关事务中止的错误。

谷歌什么都不会带来,那会是什么?

码:

final Firebase userLocation = new Firebase(Constants.USERS_URL).child(uid);

    User newUser = new User(name, email);

    userLocation.setValue(newUser, new Firebase.CompletionListener() {
        @Override
        public void onComplete(FirebaseError firebaseError, Firebase firebase) {
            if(firebaseError == null) {
                ...
            }
            else {
                ...
            }
        }
    });
Run Code Online (Sandbox Code Playgroud)

日志:

04-05 16:13:04.274 4855-4912/com.nicedistractions.bestbefore D/AuthenticationManager: Sending request to https://auth.firebase.com/v2/best-before/users with 2 query params
04-05 16:13:05.437 4855-4855/com.nicedistractions.bestbefore I/RegisterPresenter: Successfully created user account with uid: 4a97cb4b-4034-4f46-98c3-4104d1d649b7
04-05 16:13:05.437 4855-4855/com.nicedistractions.bestbefore D/RegisterPresenter: Creating user object
04-05 16:13:05.484 4855-4912/com.nicedistractions.bestbefore D/WebSocket: ws_1 - Reset keepAlive. Remaining: 0
04-05 16:13:05.502 4855-4912/com.nicedistractions.bestbefore D/RepoOperation: set: /users/4a97cb4b-4034-4f46-98c3-4104d1d649b7
04-05 16:13:05.503 4855-4912/com.nicedistractions.bestbefore D/DataOperation: set: /users/4a97cb4b-4034-4f46-98c3-4104d1d649b7 {
                                                                                email=xxxxxxxxxx@gmail.com
                                                                                name=xxxxx xxxxxxxx
                                                                                timestampJoined={
                                                                                  timestamp={.sv=timestamp}
                                                                                }
                                                                              }
04-05 16:13:05.503 4855-4912/com.nicedistractions.bestbefore D/Persistence: Starting transaction.
04-05 16:13:05.524 4855-4912/com.nicedistractions.bestbefore D/Persistence: Persisted user overwrite in 20ms
04-05 16:13:05.536 4855-4912/com.nicedistractions.bestbefore D/Persistence: Transaction completed. Elapsed: 33ms
04-05 16:13:05.538 4855-4912/com.nicedistractions.bestbefore D/RepoOperation: Aborting transactions for path: /users/4a97cb4b-4034-4f46-98c3-4104d1d649b7. Affected: /users/4a97cb4b-4034-4f46-98c3-4104d1d649b7
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助!

pol*_*uts 2

当我连接到 wifi 时,我能够在 Lollipop 上重现这一点,禁用实际的互联网连接,然后重新启用互联网连接(所有这些都使设备保持连接到 wifi 网络)。此后,如果我尝试执行 setValue() 写入,则在 Firebase 重新连接和 setValue() 完成之前大约需要 18 分钟。我联系了 Firebase 团队,被告知这是预期行为,因为 Android 操作系统基本上忽略了在连接恢复时通知应用程序。

根据我的经验,解决问题的唯一方法是禁用并重新启用 WiFi,或者重新启动应用程序(重新启动 Activity 没有帮助)。

Firebase 支持人员回复我并建议goOffline()先致电goOnline()- 我确认这会立即重新连接 Firebase 数据库。我现在要做的就是为 setValue() 设置一个带有我自己的超时的处理程序,因为我似乎不能依赖于 onComplete() 抛出的 DatabaseError 。