0

问题:我想将巨大的对象映射(1000 个联系人)存储到 SharedPreferences 中。

我有 Cordova 应用程序,其中第一次加载所有联系人并将所有照片转换为 base64 字符串。

通常,此过程可能需要大约 30 秒。出于这个原因,我的目标是将所有联系人作为字符串存储到 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)

这是我将 Map 转换为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();
    } 

有没有其他方法可以将 Map 存储在 SharedPreferences 中,或者我可以以某种方式存储OutputStream

4

2 回答 2

1

使用文件http://developer.android.com/guide/topics/data/data-storage.html。共享偏好不应该存储大数据。使用文件或 sqlote 数据库。

于 2014-09-21T21:12:56.967 回答
0

如果您想存储大量数据,共享首选项不是可行的方法。您可能应该在设备上使用 SQLite 数据库。您可以在文档中阅读如何准确地做到这一点

于 2014-09-21T21:13:23.007 回答