Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android-Firebase字符串返回';空';_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Android-Firebase字符串返回';空';

Android-Firebase字符串返回';空';,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,好, 我觉得这真的很奇怪。 我有一个Android Studio项目,有一个开放的Firebase数据库(读/写:“true”),在那里我成功地编写和检索数据 现在我启动了一个新项目,让它与我的Android Studio同步,并下载了“googleservice.json”。和以前一样 现在,我的Android项目能够写入数据,但无法检索数据。奇怪的 我在网上搜索过,大部分被重定向到StackOverflow,并尝试了所有方法。这一点都不难,但我不知道哪里出了问题 我的格拉德尔有: repo

好,

我觉得这真的很奇怪。 我有一个Android Studio项目,有一个开放的Firebase数据库(读/写:“true”),在那里我成功地编写和检索数据

现在我启动了一个新项目,让它与我的Android Studio同步,并下载了“googleservice.json”。和以前一样

现在,我的Android项目能够写入数据,但无法检索数据。奇怪的 我在网上搜索过,大部分被重定向到StackOverflow,并尝试了所有方法。这一点都不难,但我不知道哪里出了问题

  • 我的格拉德尔有:

    repositories {
        maven {
            url "https://maven.google.com"
        }
    }
    
编译'com.google.firebase:firebase数据库:11.0.4'

  • 我的项目是同步的:我遵循了“工具”>“Firebase”>“实时数据库”的步骤
  • Android Studio已使用正确的帐户登录
  • 我已经下载了“googleservice.json”,并把它放在了正确的位置
  • 我的Firebase具有以下格式:
当前版本:“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建议后更新

这仍然显示一条空的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
        }
    });
}
以及:

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();
}