2017-02-22 39 views
0

我的数据库:为什么我在Firebase-RealDatabase上获取ArrayList而不是HashMap?

{ 
    "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“是一个String键。我们不关注,问题在别处 – Skemelio

+0

我只是问为什么你认为它应该是一张地图......你的firebase数据库线性列出了元素,对吧?通过索引定位。 –

回答

3

您已将“数据库”显示为JSON文档。

如果您使用JSON解析器进行解析,当然,您可能期望得到一个TreeMap,但是按照Firebase的说法,我认为您已经将元素的“索引”与您认为应该是“键”。

所以,你得到一个列表,而不是一个地图。没什么大不了的,真的。您仍然可以遍历元素

如果你想有一个(有点)结构更合理,我会建议

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

或者弗兰克评论,请使用火力地堡可产生自然键顺序。

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()'方法来生成这样的ID。但是,在极不可能的情况下,您的键*必须使用连续的数字值,并在其前面添加一个字符串以防止Firebase的数组强制。例如。 'store1','store2','store3'。 –

相关问题