2017-02-22 21 views
0

Моя база данных:Почему я получаю ArrayList вместо HashMap в Firebase-RealDatabase?

{ 
    "Shops": { 
     "Title": { 
      "1": "Footlocker", 
      "2": "Nike Store", 
      "3": "Adidas Store" 
     }, 
     "Lat": { 
      "1": "123", 
      "2": "123", 
      "3": "123" 
     }, 
     "Lon": { 
      "1": "123", 
      "2": "123", 
      "3": "123" 
     } 
    } 
} 

Цифры "1", "2" и "3" представляет собой магазин. Например, в магазине «1» есть «Footlocker» для названия и «123» широты (вероятно, это должно быть число, но это не моя проблема).

Моя цель состоит в том, чтобы получить все титулы в Hashmap<String,String> (ключ будет «1» ... значение «сундучок» и т.д ...)

Так я создаю ссылку на ключ «Название» в базе данных и добавить слушателя,

DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("Shops").child("Title"); 
ref.addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       HashMap<String,String> map = (HashMap<String,String>) dataSnapshot.getValue(); 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 

Как вы можете себе представить, приведенный выше код генерирует исключение, так как ArrayList не может быть приведен к HashMap.

Мой вопрос: Не должен ли я получать HashMap вместо цифр в качестве ключей и названий в качестве значений?

+0

Ваших ключи больше похожи на индексы в списке, чем ключи для карты –

+0

@ cricket_007 Я знаю, что это не правильное значение ключа, но даже " 1 "является строковым ключом. Не будем здесь сосредоточиться, проблема в другом месте – Skemelio

+0

Я просто спрашиваю, почему вы думаете, что это должна быть карта ... Ваша база данных базы данных содержит элементы линейно, верно? По позиционированию индекса. –

ответ

3

Вы указали свою «базу данных» как документ JSON.

Если вы проанализировали, что с помощью анализатора JSON, конечно, вы можете ожидать, что TreeMap будет точнее, но в терминах Firebase, я думаю, вы путали «индекс» элементов с тем, что, по вашему мнению, должно быть «ключ».

Итак, вы получаете список, а не карту. На самом деле ничего страшного. Вы все еще можете перебирать элементы

Если вы хотите (несколько) лучше структуру, я хотел бы предложить

Stores 
    Footlocker 
     Lat 
     Lon 
    Nike 
     ... 
    Adidas 
     ... 

Или как комментарии Frank, использовать естественный ключ упорядоченность, что Firebase может генерировать.

Stores 
    <id_0> 
     name: "Footlocker" 
     Lat: 0.00 
     Lon: 0.00 
    <id_1> 
     name: "Nike" 
     ... 
    <id_2> 
     name: "Adidas" 
     ... 

Дополнительная точка. Не используйте HashMap, использовать объекты для представления данных

public class Store { 
    String name; 
    Double lat, lon; 

    public Store() { 
     // Required empty-constructor 
    } 

    // getters & setters... 
} 
+0

Спасибо.Можете ли вы поделиться хорошим источником для создания лучшей структуры для базы данных json? – Skemelio

+0

Не совсем ... Просто берет практику и полностью зависит от запросов, которые вы хотите запустить –

+2

Хороший ответ! К комментарию моделирования данных: если элементы имеют естественный ключ, используйте этот естественный ключ для их хранения. Поэтому, когда вы сохраняете список пользователей, храните их под своим UID. Если у ваших магазинов еще нет естественного ключа, подумайте о том, чтобы создать тот, который не подвержен этой проблеме. Документация Firebase использует метод 'push()' для генерации таких идентификаторов. Но в очень маловероятном случае, когда ваши ключи * должны * использовать последовательные числовые значения, прикрепите их к строке, чтобы предотвратить принуждение массива Firebase. Например. 'магазин1',' магазин2', 'магазин3'. –