【发布时间】: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