为什么我在Firebase-RealDatabase上获取ArrayList而不是HashMap?

时间:2017-02-22 13:29:56

标签: android firebase firebase-realtime-database

我的数据库:

    {
    "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>中的所有标题(关键是&#34; 1&#34; ...值&#34; Footlocker&#34;等等...)

所以我创建了对#34; Title&#34;的引用。键入数据库并添加监听器

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吗?

1 个答案:

答案 0 :(得分:3)

您已经展示了自己的数据库&#34;作为JSON文档。

如果你使用JSON解析器解析它,当然,你可能期望TreeMap是准确的,但是在Firebase的术语中,我认为你已经混淆了#34;索引&#34;您认为应该是&#34;键&#34;的元素。

所以,你得到一个清单,而不是地图。没什么大不了的,真的。您仍然可以迭代元素

如果你想要(有些)更好的结构,我会建议

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...
}