Android-Firebase字符串返回';空';
好, 我觉得这真的很奇怪。 我有一个Android Studio项目,有一个开放的Firebase数据库(读/写:“true”),在那里我成功地编写和检索数据 现在我启动了一个新项目,让它与我的Android Studio同步,并下载了“googleservice.json”。和以前一样 现在,我的Android项目能够写入数据,但无法检索数据。奇怪的 我在网上搜索过,大部分被重定向到StackOverflow,并尝试了所有方法。这一点都不难,但我不知道哪里出了问题Android-Firebase字符串返回';空';,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,好, 我觉得这真的很奇怪。 我有一个Android Studio项目,有一个开放的Firebase数据库(读/写:“true”),在那里我成功地编写和检索数据 现在我启动了一个新项目,让它与我的Android Studio同步,并下载了“googleservice.json”。和以前一样 现在,我的Android项目能够写入数据,但无法检索数据。奇怪的 我在网上搜索过,大部分被重定向到StackOverflow,并尝试了所有方法。这一点都不难,但我不知道哪里出了问题 我的格拉德尔有: repo
- 我的格拉德尔有:
repositories { maven { url "https://maven.google.com" } }
- 我的项目是同步的:我遵循了“工具”>“Firebase”>“实时数据库”的步骤李>
- Android Studio已使用正确的帐户登录李>
- 我已经下载了“googleservice.json”,并把它放在了正确的位置李>
- 我的Firebase具有以下格式:
- 获取此代码:
FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance(); DatabaseReference databaseReference = firebaseDatabase.getReference("currentVersion"); databaseReference.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { // This method is called once with the initial value and again // whenever data at this location is updated. versionCheckFirebase = dataSnapshot.getValue(String.class); } @Override public void onCancelled(DatabaseError error) { // Failed to read value } }); Toast.makeText(this, versionCheckFirebase, Toast.LENGTH_SHORT).show();
-当我调用此方法时,它应该在此时获取数据并对其进行处理。但是现在,每当我更新Firebase数据库时,数据只会被调用/更新/检索 --编辑--根据@Bob Snyder的建议进行更新 解决方案 让它工作起来:
public void getCurrentVersionFirebase(){
databaseReference = firebaseDatabase.getReference("currentVersion");
databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
// This method is called once with the initial value and again
// whenever data at this location is updated.
String dataFromFirebase = dataSnapshot.getValue(String.class);
checkAppForUpdate(dataFromFirebase);
}
@Override
public void onCancelled(DatabaseError error) {
// Failed to read value
}
});
}
以及:
onDataChange()
回调是异步的。在当前代码中,当执行显示toast的语句时,回调将不会运行。将您的祝酒词移至该方法:
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
// This method is called once with the initial value and again
// whenever data at this location is updated.
versionCheckFirebase = dataSnapshot.getValue(String.class);
Toast.makeText(this, versionCheckFirebase, Toast.LENGTH_SHORT).show();
}
还是不行。有关此操作的详细信息,请参阅顶部帖子中的编辑。您在Firebase实时数据库中有权限吗?它在另一个字符串上工作吗?我看到它在工作,每当我更新数据库时,但每当我调用该方法检索数据并对其数据进行处理时,我只想获取/检索数据一次。听起来你应该使用
addListenerForSingleValueEvent()
而不是addValueEventListener()
。“现在,只有在我更新Firebase数据库时才会调用/更新/检索数据”这不是Firebase的ValueEventListener
的工作方式。连接侦听器时,Firebase立即开始读取该位置的值并激发onDataChange()
使用它所定义的值。这似乎可行,但数据检索速度非常慢,以后使用此值的方法显示为null。数据检索中的toast是我希望的值。但我确保下一个使用数据的方法在数据检索后立即激活。我将更新我的帖子。谢谢!
public void checkAppForUpdate(String dataFromFirebase){
// do your stuff
}
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
// This method is called once with the initial value and again
// whenever data at this location is updated.
versionCheckFirebase = dataSnapshot.getValue(String.class);
Toast.makeText(this, versionCheckFirebase, Toast.LENGTH_SHORT).show();
}