java - 如何从 Firebase 实时数据库中获取两个变量
问题描述
static double lat2;
static double lon2;
private void InitMapElements() {
DatabaseReference zonesRef = FirebaseDatabase.getInstance().getReference("markers");
DatabaseReference zone1Ref = zonesRef.child("m-1"); //database path
DatabaseReference zone1NameRef = zone1Ref.child("latit");
DatabaseReference zone2NameRef = zone1Ref.child("longit");
zone1NameRef.addValueEventListener(new ValueEventListener() { //reading the first coordinate
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Double lat1 = dataSnapshot.getValue(Double.class);
lat2 = lat1;
}
@Override
public void onCancelled(DatabaseError error) {
// Failed to read value
}
});
zone2NameRef.addValueEventListener(new ValueEventListener() { //reading the second coordinate
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Double lon1 = dataSnapshot.getValue(Double.class);
lon2 = lon1;
}
@Override
public void onCancelled(DatabaseError error) {
}
});
}
无法在线获取两个变量,然后将其保存到 Firebase 实时数据库中的静态变量中,变量仅在调用方法时获取一次值。使用一个变量,一切正常。如果您更改基础上的值,则变量会更改,但使用两个不起作用。
解决方案
无需附加两个侦听器即可获取这两个值。一个听众就可以解决你的问题。要解决此问题,请使用以下代码行:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference ref = rootRef.child("markers").child("m-1");
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
double lat = dataSnapshot.child("latit").getValue(Double.class);
double lon = dataSnapshot.child("longit").getValue(Double.class);
Log.d(TAG, lat + ", " + lon);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
}
};
ref.addListenerForSingleValueEvent(valueEventListener);
如您所见,这两个值都是从DataSnapshot
对象中提取的。由于此方法的异步行为,这两个变量lat
都lon
将仅在回调内部可用。onDataChange()
如果你想在外面使用它们,我建议你从这篇文章中查看我的答案的最后一部分,我在其中解释了如何使用自定义回调来完成它。您也可以观看此视频以更好地理解。
推荐阅读
- python - 我的 Discord.py 调平系统问题 - 传奇
- apache-kafka - 同步Kafka生产者是否有任何例外
- jersey - 类型 javax.ws.rs.core.Form 的 Resteasy 抛出错误 RESTEASY003215
- azure-active-directory - 测试 - Azure AD 是否支持 ABAC(基于属性的访问控制)?
- rust - 关联类型的等式约束的替代方法
- r - 在ggplot中循环时获取X轴的变量名称?
- python - 使用 tkinter 创建一个变量来存储其他帧的输入框信息
- swift - 在 Vapor 4 中的文件流之后运行操作
- c++ - 指定初始化器不适用于 char 数组
- ios - 用于对话的 twilio iOS SDK 不会向代理显示错误