Android - Firebase 字符串返回 'null'

标签 android firebase firebase-realtime-database

好的,

我觉得这真的很奇怪。 我有一个带有开放 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/

相关文章:

ios - FIRDatabaseReference 的错误监听器被解雇

android - 新的 Google 开发者控制台崩溃堆栈跟踪不再准确

ios - children count 总是返回0 ,无法正确到达

firebase - 解决 Firestore 引用

java - 如何使用 Firebase 中的 json 视频链接

ios - 使用 firebase 检索图像给出 : EXC_BAD_ACCESS (code=1, 地址=0x10)

android - 如何在android 12中通过听筒播放音频?

android - 如何远程调试Crosswalk webview?

android - 多个立体声音轨

java - 错误 :(93, 34) 错误:类 Request 中的构造函数 Request 无法应用于给定类型原因:实际参数列表和形式参数列表的长度不同