0

Я хранятся Geofire координаты в базе данных, и теперь я пытаюсь получить их с помощью childEventListener() так:Как получить «двойные» значения, сохраненные под одним ключом в Firebase?

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

Я m получение этой ошибки: java.lang.ClassCastException: java.lang.Double cannot be cast to java.util.Map на линии, указанной выше.

Что здесь не так и почему я получаю эту ошибку?

Пожалуйста, дайте мне знать.

+0

Вы пытаетесь получить всю геолокацию или только определенные двойных значения? – hotrod

+0

конкретные двойные значения ... как уже показано в вопросе. –

ответ

1

Если вы используете addChildEventListener, то DataSnapshot производится от дочернего узла ссылочного узла. Так что в вашем случае, ваш исх узел 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(); 
     } 
    } 

    ... 
}); 

Надеется, что это помогает

+0

получение этой ошибки: 'java.lang.ClassCastException: java.util.ArrayList нельзя использовать в java.util.Map' после использования' addValueEventListener'. –

+0

Вам действительно нужно, чтобы это был объект «Карта» или «Список» в порядке? Я отредактирую свой ответ, исходя из ваших потребностей. – koceeng

+0

Мне просто нужно присвоить соответствующие значения соответствующим строкам, которые являются 'meetingLatString' и' 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()); 
      } 
     }); 

 Смежные вопросы

  • Нет связанных вопросов^_^