好的,
我觉得这真的很奇怪。 我有一个带有开放 Firebase 数据库(读/写:“true”)的 Android Studio 项目,我在那里设法写入和检索数据。
现在我已经启动了一个新项目,将其与我的 Android Studio 同步并下载了“google-service.json”。和以前一样。
现在我的 Android 项目能够写入数据,但无法检索数据。奇怪的! 我搜索过网络,大部分都重定向到 StackOverflow 并尝试了所有方法。就是一点也不难,只是不知道哪里出了问题。
我的 gradle 有:
repositories { maven { url "https://maven.google.com" } }
compile 'com.google.firebase:firebase-database:11.0.4'
- 我的项目已同步:我已按照“工具”>“Firebase”>“实时数据库”步骤操作;
- Android Studio 已使用正确的帐户登录;
- 我已下载“google-service.json”并将其放在正确的位置;
- 我的 Firebase 具有以下格式:
currentVersion: "2.06"
没什么特别的。
得到这个代码:
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();
没有任何问题,我可以通过以下方式将数据写入该数据库:
databaseReference.setValue("2.06");
但是当我从数据库中读取这个值时,它是一个空字符串(null)。
怎么样?为什么?
-- 编辑 -- 根据@Bob Snyder的建议进行更新
databaseReference = firebaseDatabase.getReference("currentVersion");
//databaseReference.setValue("2.06");
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);
Toast.makeText(MainActivity.this, versionCheckFirebase, Toast.LENGTH_SHORT).show();
}
@Override
public void onCancelled(DatabaseError error) {
// Failed to read value
}
});
这仍然显示一条空的 toast 消息。 但是当我在 Firebase 中更新数据时,它直接在 toast 中显示数据。
我想要的是: - 当我调用这个方法时,它应该获取此时的数据并用它做一些事情。但现在只有当我更新 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
}
});
}
还有:
public void checkAppForUpdate(String dataFromFirebase){
// do your stuff
}
最佳答案
onDataChange()
回调是异步的。在当前代码中,当执行显示 toast 的语句时,回调将不会运行。将您的 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();
}
关于Android - Firebase 字符串返回 'null',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45963266/