保存和检索共享首选项中自定义对象列表的通用方法

时间:2016-10-17 12:27:48

标签: android object gson sharedpreferences

有许多与此主题相关的SO问题,但都讨论了在共享首选项中存储或检索的特定类型的自定义对象列表,

但我的问题是如何在共享的首选项中存储任何类型的对象列表:

我的尝试(与TinyDB几乎相同):

商品

public void putListObject(String key, ArrayList<Object> objArray){
        Gson gson = new Gson(); 
        ArrayList<String> objStrings = new ArrayList<String>();
        for(Object obj : objArray){
            objStrings.add(gson.toJson(obj));
        }
        preferences.edit().putString(key, objStrings).apply();
    }

获取

public List<Object> getListObject(String key, Class<?> mClass){
        Gson gson = new Gson(); 

        List<String> objStrings = new ArrayList<String>(Arrays.asList(TextUtils.split(preferences.getString(key, ""), "‚‗‚")));
        List<Object> objects =  new ArrayList<Object>();

        for(String jObjString : objStrings){
            Object value  = gson.fromJson(jObjString,  mClass);
            objects.add(value);
        }
        return objects;
    }

上述代码中的问题是,它将值存储在共享首选项中,但无法按预期将其恢复。

预期行为:

class myClass{
  int i;
}

List<myClass> mc = new ArrayList();

// Store:

putListObject("KEY",mc);


// GET:

List<myClass> tr = getListObject("KEY",myClass.class); // error here

2 个答案:

答案 0 :(得分:0)

getListObject方法中,您将返回普通对象列表,而此行List<myClass> tr = getListObject("KEY",mc.myClass.class);中的tr接受myClass对象列表。

答案 1 :(得分:0)

我也在努力实现TinyDB,但是我能够如下解析getListObject和putListObject:

public <T> ArrayList<T> getListObject(String key, Class<T> mClass){
    Gson gson = new Gson();

    ArrayList<String> objStrings = getListString(key);
    ArrayList<T> objects =  new ArrayList<T>();

    for(String jObjString : objStrings){
        T value  = gson.fromJson(jObjString,  mClass);
        objects.add(value);
    }
    return objects;
}

public <T> void putListObject(String key, ArrayList<T> objArray){
    checkForNullKey(key);
    Gson gson = new Gson();
    ArrayList<String> objStrings = new ArrayList<String>();
    for(T obj : objArray){
        objStrings.add(gson.toJson(obj));
    }
    putListString(key, objStrings);
}

注意,我使用泛型而非Object类型。

希望这会有所帮助!