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