【问题标题】:Firebase onDataChange returns null value after internet reconnection互联网重新连接后 Firebase onDataChange 返回空值
【发布时间】:2022-02-14 05:48:55
【问题描述】:

我有这段代码来读取数据并将值写入对象

if(SpecialFunction.isNetworkAvailable()) {
    databaseContent.loadAccountFromDatabase(account -> {
        this.account = account;
        binding.textView3.setText(account.toString());
    });
} else {
    startActivity(new Intent(this, InternetTroubleActivity.class));
}

其中 databaseContent 是一个包含我需要的 Firebase 逻辑的类。 在 loadAccountFromDatabase 中,我有下一个代码可以解决一个问题。

  public void loadAccountFromDatabase(FirebaseCallbackAccount accountFirebaseCallback) {
     ValueEventListener valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {
            if (snapshot.exists()) {
                account = snapshot.getValue(Account.class);
            } else {
                account = new Account();
                setDefaultAccount();
            }
            accountFirebaseCallback.onCallback(account);
        }
        @Override
        public void onCancelled(@NonNull DatabaseError error) {
            Log.e("loadAccountFromDatabase", "Error:  " + error.toString());
        }
    };
    database.addValueEventListener(valueEventListener);
}

当我在重新连接互联网后尝试读取数据或在 onStart() 之后打开互联网并运行 loadAccountFromDatabase 时,我的快照为空值。 我有一个方法 (isNetworkAvailable()) 效果很好,当我没有互联网连接时它返回 false。 下一部分代码无法正常工作。 snapshot.exists 返回 true,而 snapshot.getValue 返回 null,尽管值是 other。

if (snapshot.exists()) {
    account = snapshot.getValue(Account.class);
}

如果我运行具有 Internet 连接的应用程序,则一切正常,而我没有关闭 Internet 并尝试再次阅读。 我也尝试使用 database.get().addOnCompleteListener(onCompleteListener)... 但我得到了相同的结果。一切正常,而我在重新连接互联网后不尝试读取数据。

database.keepSynced(true) 也无济于事。

更新##

数据库初始化:

private final String USER_KEY = "Account", PURCHASES = "purchases";

    public void init() {
        mAuth = FirebaseAuth.getInstance();
        firebaseDatabase = FirebaseDatabase.getInstance();
        database = firebaseDatabase.getReference(String.format("%s/%s", USER_KEY, mAuth.getUid()));
    }

结构: console

更新 2##

为了帮助您理解问题,我添加了日志截图。绿框:我通过互联网连接运行我的应用程序。数据被正确读取和写入。红框:我关闭了我的应用程序,破坏了活动,关闭了互联网。然后我运行我的应用程序,但是方法 isNetworkAvailable 并没有让我运行 MainActivity。然后我打开互联网并点击按钮。正在尝试读取数据,但我得到了带有空变量的对象,尽管它们不是空的。如果您认为 isNetworkAvailable 有问题,我会告诉您这个问题是在我添加它之前出现的。我希望它能帮助我正确阅读,但没有帮助。 logcat

更新 3##

JSON:

{
  "Account" : {
    "wBOZsnGGywYIpap3cLZodPOWcpt2" : {
      "budget" : 100,
      "budgetLastMonth" : 0,
      "budgetLeft" : 100,
      "currencyType" : "USD",
      "email" : "bibishka117@gmail.com",
      "id" : "wBOZsnGGywYIpap3cLZodPOWcpt2",
      "personName" : "новый пользователь"
    }
  }
}

【问题讨论】:

  • 变量database是如何初始化的?
  • 互联网重新连接到您尝试访问它之间的秒数,有时“链接”在线但没有实际流量
  • @FrankvanPuffelen 更新
  • @MauricioGraciaGutierrez 我正在尝试在连接恢复后读取数据。当 onDataChange 运行时,控制台中的数据也变为空值。
  • 您能否在您的代码中记录mAuth.getUid() 的值,并向我们展示更新后的代码及其日志输出?那么您是否还可以显示您认为应该为该 UID 读取的 JSON(作为文本,请不要截图)?您可以通过单击Firebase Database console 上溢出菜单 (⠇) 中的“导出 JSON”链接来获取此信息。

标签: android firebase firebase-realtime-database


【解决方案1】:

我发现了一个问题。 4 小时阅读我的​​代码和 stackoverflow。我不知道怎么做,但是在 onPause () 中,我有将空对象写入数据库的代码。 所以当我测试并打开/关闭互联网时,我运行它。所以我在控制台写了一个没有立即更新的空对象,当我打开互联网时,该对象在数据库中更新为零,然后在我的应用程序中读取。 :]

【讨论】:

    猜你喜欢
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多