问题:我想将大量的对象地图(1000个联系人)存储到SharedPreferences中。
我有Cordova应用程序,第一次加载所有联系人并将所有照片转换为base64字符串。
通常这个过程可能需要大约30秒。出于这个原因,我的目标是将所有联系人作为String存储到SharedPreferences以便在快速加载之后加载。
我使用GSON库,但不管我做什么,我得到:
java.lang.OutOfMemoryError
at java.lang.String.<init>(String.java:354)
at java.lang.String.<init>(String.java:171)
at java.io.ByteArrayOutputStream.toString(ByteArrayOutputStream.java:137)
这是我的方法,我将地图转换为ByteArrayOutputStream
但在最后一行得到例外:out.toString()
public static String getStrFromGroupsListJSONObject(ConcurrentHashMap<String, WmContactImage> contactMap){
Gson gson = getInstance();
OutputStream out = new ByteArrayOutputStream();
try {
JsonWriter writer = new JsonWriter(new OutputStreamWriter(out, "UTF-8"));
Iterator<String> it = contactMap.keySet().iterator();
WmContactImage img;
writer.beginObject(); // {
while(it.hasNext()){
String key = it.next();
writer.name(key);
img = contactMap.get(key);
gson.toJson(img, WmContactImage.class, writer);
}
writer.endObject(); // }
writer.close();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return out.toString();
}
有没有其他方法可以在SharedPreferences中存储Map,还是可以以某种方式存储OutputStream
?
答案 0 :(得分:1)
使用文件http://developer.android.com/guide/topics/data/data-storage.html。共享首选项不应存储大数据。使用文件或sqlote数据库。
答案 1 :(得分:0)
如果您想存储大量数据,则无法使用共享首选项。您应该在设备上使用SQLite数据库。您可以在documentation中阅读如何正确执行此操作