2014-09-21 4 views
0

Проблема: Я хочу хранить огромную карту объектов (1000 контактов) в SharedPreferences.OutOfMemoryError при попытке сохранить большие данные в SharedPreferences, Android

У меня есть приложение Cordova, где в первый раз загружается все контакты и конвертируются все фотографии в base64 String.

Обычно этот процесс может занять около 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 или я могу как-то сохранить OutputStream?

+0

«Я хочу хранить огромную карту объектов (1000 контактов) в SharePreferences» - почему? Если это в JSON, используйте JSON-файл. – CommonsWare

+0

@CommonsWare У меня нет JSON. Я пытаюсь создать его. Если я преобразую MAP в строку JSON, я получаю 'OutOfMemoryError'. Поэтому я использовал 'JsonWriter'. но все равно получайте такое же исключение, когда пытаетесь получить String из 'ByteArrayOutputStream'. Спасибо, – snaggs

+0

@CommonsWare единственный способ, который может работать, - разделить карту на несколько частей и сохранить по одному – snaggs

ответ

0

Общие предпочтения не подходят, если вы хотите хранить огромные объемы данных. Вероятно, вы должны использовать SQLite Database на устройстве. Вы можете прочитать в documentation, как это сделать.

+0

Я знаю, но мне действительно нужно только «SELECT *». Поскольку я знаю, что SQLite медленнее, чем SharePreferences, и его полезно использовать, когда вы хотите запускать некоторые запросы с условиями – snaggs

+1

@fessy 'Как я знаю, SQLite медленнее, чем SharePreferences' - откуда вы знаете? Вы это оценили? TmKVU прав. SharedPreferences - это не путь. Если вам не нужен SQLite (который для 1000 контактов будет очень быстрым), сохраните файл JSON. – Simon

+0

@Simon Я читаю документы – snaggs

Смежные вопросы