Android - 将updateChildren()与HashMap一起使用

时间:2017-11-05 17:55:39

标签: android firebase

我正在使用listview和arrayadapter,我正在使用 simple_list_item_multiple_choice ,因此我可以在listview中选择多个项目。

我想做什么:我希望所有选定的项目都插入到我的Firebase数据库中。为此,我使用的是hashmap。

我做了什么

 addUsersButton.setOnClickListener(new View.OnClickListener() {
        HashMap<String, Object> drivers = new HashMap<>();
        @Override
        public void onClick(View v) {
            int cntChoice = userList.getCount();
            SparseBooleanArray sparseBooleanArray = userList.getCheckedItemPositions();

            for (int i = 0; i < cntChoice; i++) {
                if (sparseBooleanArray.get(i)) {
                    drivers.put("drivers", userList.getItemAtPosition(i).toString());
                }

            }
            userRef.child(sharedPreferences.getString("school", null)).child("routes").child(key).updateChildren(drivers);


        }
    });

问题:这只会将其中一个选定项添加到数据库中。我不知道为什么。

1 个答案:

答案 0 :(得分:1)

对于所选项目的每次迭代,您都在调用:

drivers.put("drivers", userList.getItemAtPosition(i).toString());

哪个会覆盖"drivers"HashMap的{​​{1}}值与指定位置的项目,因此您的HashMap只包含一个关键字为"drivers"的项目。这是因为HashMap keys are unique and calling put() replaces the previous value associated with the given key if it already exists

因此,您需要使用唯一ID将每个项目添加到HashMap,然后在updateChildren()子节点上调用drivers

addUsersButton.setOnClickListener(new View.OnClickListener() {
    HashMap<String, Object> drivers = new HashMap<>();
    @Override
    public void onClick(View v) {
        int cntChoice = userList.getCount();
        SparseBooleanArray sparseBooleanArray = userList.getCheckedItemPositions();

        for (int i = 0; i < cntChoice; i++) {
            if (sparseBooleanArray.get(i)) {
                String uniqueId = usersRef.push().getKey(); // this doesn't actually push any data to the database
                drivers.put(uniqueId, userList.getItemAtPosition(i).toString()); // use the unique ID to add to the HashMap
            }
        }
        userRef.child(sharedPreferences.getString("school", null))
            .child("routes")
            .child(key)
            .child("drivers") // specify "drivers" child node here
            .updateChildren(drivers);
    }
});

这样,每个项目都会添加到具有唯一ID的HashMap,然后此HashMap会被推送到drivers子节点。