Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.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
如何使用AndroidStudio中的Java方法从Firebase实时数据库读取值?_Java_Firebase_Firebase Realtime Database_Hashmap - Fatal编程技术网

如何使用AndroidStudio中的Java方法从Firebase实时数据库读取值?

如何使用AndroidStudio中的Java方法从Firebase实时数据库读取值?,java,firebase,firebase-realtime-database,hashmap,Java,Firebase,Firebase Realtime Database,Hashmap,我的Firebase实时数据库是通过加载Java类HashMap的对象构建的。在我的Android Studio应用程序中,我试图编写一个方法,该方法以字符串(键)作为输入,在数据库中搜索,如果找到该字符串,它将返回相关的浮点(值),否则它将返回0。我该怎么做?任何帮助都将不胜感激 编辑:我试着按照建议去做,使之适应我的具体情况,但我还没有设法解决这个问题。 我在MainActivity中编写了以下代码: DatabaseReference myRef; Float tempValue; @O

我的Firebase实时数据库是通过加载Java类HashMap的对象构建的。在我的Android Studio应用程序中,我试图编写一个方法,该方法以字符串(键)作为输入,在数据库中搜索,如果找到该字符串,它将返回相关的浮点(值),否则它将返回0。我该怎么做?任何帮助都将不胜感激

编辑:我试着按照建议去做,使之适应我的具体情况,但我还没有设法解决这个问题。
我在MainActivity中编写了以下代码:

DatabaseReference myRef;
Float tempValue;

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    myRef = FirebaseDatabase.getInstance().getReference("myRoot");
    tempValue=0f;
    ...
}

public void retrieveValueFromDatabase(String childName, final MainActivity activity){
    myRef.child(childName).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Float value=dataSnapshot.getValue(Float.class);
            if (value==null){
                value=0f;
            }
            activity.tempValue=value;
            //First Toast
            //Toast.makeText(activity,"tempValue = "+tempValue.toString(), Toast.LENGTH_LONG).show();
        }
        @Override
        public void onCancelled(DatabaseError databaseError) {
            throw databaseError.toException();
        }
    });
}

public void useValues(){
    retrieveValueFromDatabase(childName,this);
    //Second Toast
    //Toast.makeText(this,"tempValue = "+tempValue.toString(), Toast.LENGTH_LONG).show();
    //code using tempValue from here
    ...
}

如果我取消对第一个toast的注释,则会显示
tempValue
中的正确值,但是如果我取消对第二个toast的注释,则显示的
tempValue
的值是默认值(0.0)。我缺少什么?

您需要使用
addValueEventListener
从数据库检索数据:

DatabaseReference ref = FirebaseDatabase.getInstance().getReference("myRoot").orderByChild("name").equalTo("peter");
ref.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        Log.i("Database", dataSnapshot.child("floatValue").getValue(Long.class));
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        throw databaseError.toException();
    }
})
在这里,您添加对根节点的引用,然后使用
equalTo()
进行查询,以检查数据库中是否存在
name=peter
,并返回浮点值

您应该阅读指南:


您是否阅读了文档并遵循了示例代码@我试着使用你链接的指南和彼得·哈达德的答案,但我还是没能成功。我通过添加我正在使用的代码来编辑我的问题,以了解我的错误在哪里!任何帮助都将不胜感激!我已经阅读了您链接的指南,但有几件事我不清楚:1)我不明白为什么我必须添加带有onDataChange和onCancelled方法的侦听器,即使我只需要以编程方式读取这些值,并且我不打算更改/删除这些数据。这背后有什么原因吗?即使我不更改数据,也会调用第一个方法吗?2) 我需要将浮点值传递给另一个方法,而不是简单地记录它,而且由于
onDataChange
方法是无效的,因此如何使用它来获得我所需要的并不直接。您建议我如何解决这个问题?1)检索数据的唯一方法是使用ValueEventListener,它包含onDataChange和onCancelled方法。onDataChange将检索数据。2) 您可以检索该值,然后在onDataChange中调用一个方法。检索该值后,将该值作为参数传递给该方法。根据您的建议,我可以在onDataChange方法中记录/打印子级的正确值,但我没有传递该值并在另一个方法中使用它。我已经在问题中添加了我正在使用的代码。如果您能帮我找出错误,我们将不胜感激!传递到其他方法的位置?应该是这样的
myRef.child(childName).addListenerForSingleValueEvent(新值EventListener(){@Override public void onDataChange(DataSnapshot DataSnapshot){Float value=DataSnapshot.getValue(Float.class);if(value==null){value=0f;}activity.tempValue=value;getData(value);//第一个Toast//Toast.makeText(activity,“tempValue=“+tempValue.toString(),Toast.LENGTH_LONG).show();}};