如何通过输入顺序保存和检索共享首选项中的数据?

时间:2017-10-21 21:33:26

标签: java android hashmap sharedpreferences

如何通过java中的输入顺序从共享首选项保存和检索数据?

当我在共享偏好中保存此类数据时

 HashMap<Integer, String> likes = new HashMap<Integer, String>();

    // THIS IS INPUT ORDER

    likes.put(1,"a")
    likes.put(2,"b")
    likes.put(3,"c")
    likes.put(4,"d")
        editor = getSharedPreferences("PREFS_NAM", 0).edit();
        for (Map.Entry<Integer, String> entry : likes.entrySet())
         editor.putString(String.valueOf((entry.getKey())), 
         entry.getValue());
        editor.apply();

当我找回它时

SharedPreferences prefs = getSharedPreferences("PREFS_NAM", 0);
    for (Map.Entry entry : prefs.getAll().entrySet()) 
           likes.put(Integer.valueOf(entry.getKey().toString()), 
           entry.getValue().toString());

看起来像

(1,"a")
(2,"b")
(4,"d")
(3,"c")

哪个输入顺序不一样!

2 个答案:

答案 0 :(得分:1)

尝试以下方法 Map<Integer, String> likes = new LinkedHashMap<Integer, String>(); LinkedHashMap 旨在将密钥,值和条目按其放入的顺序保存。

答案 1 :(得分:0)

SharedPreferences用于存储和检索简单数据,即使是稍微复杂的结构也使用它们相当尴尬。

您似乎试图存储和检索Map,并且您希望迭代顺序为插入顺序。首先,您应该使用LinkedHashMap而不是普通的HashMap,因为后者不会对迭代顺序做出任何保证。

Map<Integer, String> likes = new LinkedHashMap<>();

但是,当您从SharedPreferences获取数据时,这并不意味着保留订单。

您可以使用密钥"K0""K1""K2" ...来修复此问题,以存储地图的密钥和密钥"V0""V1",{ {1}} ...存储地图的值。像这样的东西可以工作(未经测试):

"V2"

然后检索:

int index = 0;
for (Map.Entry<Integer, String> e : likes.entrySet()) {
     editor.putInt("K" + index, e.getKey());;
     editor.putString("V" + index, e.getValue());
     index++;
}

这显然很可怕,Map<Integer, String> likes = new LinkedHashMap<>(); Map<String, ?> all = prefs.getAll(); for (int i = 0; i < all.size() / 2; i++) likes.put((Integer) all.get("K" + i), (String) all.get("V" + i)); 并非真的为此设计,但它确实有用。