0

私は、データベース内のGeofire座標を格納しているし、今私はこのようなchildEventListener()を使用してそれらを取得しようとしている:Firebaseの1つのキーの下に保存された 'double'値を取り出す方法は?

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のcoordnatesは、次のようにデータベースに格納されています。

enter image description here

私は」このエラーが発生しました:java.lang.ClassCastException: java.lang.Double cannot be cast to java.util.Mapオンライン上に指定されました。

ここで間違っているのはです。なぜこのエラーが発生しますか?

お知らせください。

+0

を助け、あなたは全体の地理的位置または特定のdouble値を取得しようとしていますか? – hotrod

+0

特定の二重の値...既に質問に示されています。 –

答えて

1

あなたがaddChildEventListenerを使用する場合は、生産DataSnapshotが参照ノードの子ノードからです。だからあなたの場合には、あなたの参照ノードがlあり、そしてonChildAdded内、dataSnapshotは次のようになります。だから、

値と
  • 値を持つキー028.8...

  • キー178.7...

onChidAdded()が2回呼び出されます。

そのロジックに基づいてコードを変更するか、代わりに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(); 
     } 
    } 

    ... 
}); 

希望これは

+0

このエラーが発生しました: 'addValueEventListener'を使用した後、java.lang.ClassCastException:java.util.ArrayListをjava.util.Map'にキャストできません。 –

+0

本当に 'Map'オブジェクトにする必要がありますか?' List'は大丈夫ですか? – koceeng

+0

それぞれの値を 'venueLatString'と' venueLngString'のそれぞれの文字列に割り当てるだけでいいです。 –

1

あなたはフォローしてください。

final HashMap<String, Object> taskMap = (HashMap<String, Object>) objectMap.getValue(); 
         double lat = Double.parseDouble(taskMap.get("0")); 
         double lng = Double.parseDouble(taskMap.get("1")); 
+0

このエラーが発生しました: 'java.lang.ClassCastException:java.lang.Doubleはjava.util.HashMap'にキャストできません。 –

+0

改善が必要ですか? –

0
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("[email protected]@__Lat Long ::", latati + " " + longit); 
      } 

      @Override 
      public void onCancelled(FirebaseError firebaseError) { 
       Log.e("!!__: ", "onCancelled ", firebaseError.toException()); 
      } 
     }); 
関連する問題