如何检索在 Firebase 中保存在一个键下的 'double' 值?
How to retrieve 'double' values saved under one key in Firebase?
我已将 Geofire
坐标存储在数据库中,现在我正尝试使用 childEventListener()
检索它们,如下所示:
mDatabase.child("geofire").child(key).child("l").addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
if (dataSnapshot.getValue() != null) {
//error on line below
Map<Double, Double> newRequest = (Map<Double, Double>) dataSnapshot.getValue();
venueLatString = newRequest.get(0).toString();
venueLngString = newRequest.get(1).toString();
Toast.makeText(getBaseContext(), dataSnapshot.getValue().toString(), Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getBaseContext(), "NULLL", Toast.LENGTH_SHORT).show();
}
}
...
...
});
Geofire 坐标像这样存储在数据库中:
我收到此错误:java.lang.ClassCastException: java.lang.Double cannot be cast to java.util.Map
在上面指定的行上。
这里出了什么问题,为什么我会收到这个错误?
请告诉我。
可以试试关注吗
final HashMap<String, Object> taskMap = (HashMap<String, Object>) objectMap.getValue();
double lat = Double.parseDouble(taskMap.get("0"));
double lng = Double.parseDouble(taskMap.get("1"));
如果使用addChildEventListener
,则产生的DataSnapshot
来自被引用节点的子节点。因此,在您的情况下,您的 ref 节点是 l
,然后在 onChildAdded
内,dataSnapshot
是:
键0
,值为28.8...
键1
,值为78.7...
因此 onChidAdded()
将被调用两次。
您可以根据该逻辑修改代码或改用 addValueEventListener
。如果你使用 addValueEventListener
,你的代码将是这样的:
mDatabase.child("geofire").child(key).child("l").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.getValue() != null) {
Double d1 = (Double) dataSnapshot.child("0").getValue();
Double d2 = (Double) dataSnapshot.child("1").getValue();
venueLatString = String.valueOf(d1);
venueLngString = String.valueOf(d2);
} else {
Toast.makeText(getBaseContext(), "NULLL", Toast.LENGTH_SHORT).show();
}
}
...
});
希望这对您有所帮助
mDatabase.child("geofire").child(key).child("l").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
double latati = 0, longit = 0;
for (DataSnapshot child : dataSnapshot.getChildren()) {
// Log.e("!! All Data ::> ", child.getKey()+" "+child.getValue());
if (child.getKey().equalsIgnoreCase("0")) {
latati = Double.parseDouble(String.valueOf(child.getValue()));
}
if (child.getKey().equalsIgnoreCase("1")) {
longit = Double.parseDouble(String.valueOf(child.getValue()));
}
}
Log.e("!_@@__Lat Long ::", latati + " " + longit);
}
@Override
public void onCancelled(FirebaseError firebaseError) {
Log.e("!!__: ", "onCancelled ", firebaseError.toException());
}
});
我已将 Geofire
坐标存储在数据库中,现在我正尝试使用 childEventListener()
检索它们,如下所示:
mDatabase.child("geofire").child(key).child("l").addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
if (dataSnapshot.getValue() != null) {
//error on line below
Map<Double, Double> newRequest = (Map<Double, Double>) dataSnapshot.getValue();
venueLatString = newRequest.get(0).toString();
venueLngString = newRequest.get(1).toString();
Toast.makeText(getBaseContext(), dataSnapshot.getValue().toString(), Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getBaseContext(), "NULLL", Toast.LENGTH_SHORT).show();
}
}
...
...
});
Geofire 坐标像这样存储在数据库中:
我收到此错误:java.lang.ClassCastException: java.lang.Double cannot be cast to java.util.Map
在上面指定的行上。
这里出了什么问题,为什么我会收到这个错误?
请告诉我。
可以试试关注吗
final HashMap<String, Object> taskMap = (HashMap<String, Object>) objectMap.getValue();
double lat = Double.parseDouble(taskMap.get("0"));
double lng = Double.parseDouble(taskMap.get("1"));
如果使用addChildEventListener
,则产生的DataSnapshot
来自被引用节点的子节点。因此,在您的情况下,您的 ref 节点是 l
,然后在 onChildAdded
内,dataSnapshot
是:
键
0
,值为28.8...
键
1
,值为78.7...
因此 onChidAdded()
将被调用两次。
您可以根据该逻辑修改代码或改用 addValueEventListener
。如果你使用 addValueEventListener
,你的代码将是这样的:
mDatabase.child("geofire").child(key).child("l").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.getValue() != null) {
Double d1 = (Double) dataSnapshot.child("0").getValue();
Double d2 = (Double) dataSnapshot.child("1").getValue();
venueLatString = String.valueOf(d1);
venueLngString = String.valueOf(d2);
} else {
Toast.makeText(getBaseContext(), "NULLL", Toast.LENGTH_SHORT).show();
}
}
...
});
希望这对您有所帮助
mDatabase.child("geofire").child(key).child("l").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
double latati = 0, longit = 0;
for (DataSnapshot child : dataSnapshot.getChildren()) {
// Log.e("!! All Data ::> ", child.getKey()+" "+child.getValue());
if (child.getKey().equalsIgnoreCase("0")) {
latati = Double.parseDouble(String.valueOf(child.getValue()));
}
if (child.getKey().equalsIgnoreCase("1")) {
longit = Double.parseDouble(String.valueOf(child.getValue()));
}
}
Log.e("!_@@__Lat Long ::", latati + " " + longit);
}
@Override
public void onCancelled(FirebaseError firebaseError) {
Log.e("!!__: ", "onCancelled ", firebaseError.toException());
}
});