Intereting Posts
Фильтрация ListView с помощью CursorLoader И FilterQueryProvider? Перейдите в окно «Разрешение приложений» приложения В Android Market, как часто разработчики могут / должны обновлять свои файлы apk? Установите Android в полноэкранном режиме в манифесте Ожидание ожидаемого намерения не будет работать после того, как приложение будет приостановлено или убито PhoneGap – принудительная ориентация ландшафта Ошибка загрузки. Вам необходимо использовать другой код версии для вашего APK, потому что у вас уже есть код версии 2 Получить каталог приложений Не удалось найти поддержку-v4.jar (com.android.support:support-v4:24.0.0) Изменение позиции меню панели действий в Android Android – выбор текста из EditText Эмулятор Android не отображается в Device Chooser Android Proguard ZipException при создании подписанного APK Принудительное применение для перезапуска при первом действии Выровнять две кнопки по горизонтали

Как я могу хранить структуру данных, такую ​​как Hashmap внутри Android?

В моем приложении Android я пытаюсь сохранить структуру карты, такую ​​как: Map<String, Map<String, String>> используя внутреннее хранилище. Я изучил использование SharedPreferences , но, как вы знаете, это работает только при сохранении примитивных типов данных. Я попытался использовать FileOutputStream , но он позволяет мне писать только в байтах … Мне нужно каким-то образом сериализовать Hashmap, а затем записать в файл?

Я пробовал читать через http://developer.android.com/guide/topics/data/data-storage.html#filesInternal, но я не могу найти свое решение.

Вот пример того, что я пытаюсь сделать:

 private void storeEventParametersInternal(Context context, String eventId, Map<String, String> eventDetails){ Map<String,Map<String,String>> eventStorage = new HashMap<String,Map<String,String>>(); Map<String, String> eventData = new HashMap<String, String>(); String REQUEST_ID_KEY = randomString(16); . //eventData.put... . //eventData.put... eventStorage.put(REQUEST_ID_KEY, eventData); FileOutputStream fos = context.openFileOutput(EVENT_FILENAME, Context.MODE_PRIVATE); fos.write(eventStorage) //This is wrong but I need to write to file for later access.. } 

Каков наилучший подход для хранения этого типа структуры данных внутри приложения Android? Извините, если это кажется глупым вопросом, я очень новичок в Android. Заранее спасибо.

HashMap является сериализуемым, поэтому вы можете просто использовать FileInputStream и FileOutputStream в сочетании с ObjectInputStream и ObjectOutputStream .

Чтобы написать HashMap в файл:

 FileOutputStream fileOutputStream = new FileOutputStream("myMap.whateverExtension"); ObjectOutputStream objectOutputStream= new ObjectOutputStream(fileOutputStream); objectOutputStream.writeObject(myHashMap); objectOutputStream.close(); 

Чтобы прочитать HashMap из файла:

 FileInputStream fileInputStream = new FileInputStream("myMap.whateverExtension"); ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream); Map myNewlyReadInMap = (HashMap) objectInputStream.readObject(); objectInputStream.close(); 

Письмо:

 FileOutputStream fos = context.openFileOutput(EVENT_FILENAME, Context.MODE_PRIVATE); ObjectOutputStream s = new ObjectOutputStream(fos); s.writeObject(eventStorage); s.close(); 

Чтение выполняется в обратном порядке и выполняется для вашего типа в readObject

+1 для ответа Стива Р, но он не работает напрямую, и во время чтения я получаю FileNotFoundException, я пробовал это, и он работает хорошо.

Написать,

 try { FileOutputStream fos = context.openFileOutput("YourInfomration.ser", Context.MODE_PRIVATE); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(myHashMap); oos.close(); } catch (IOException e) { e.printStackTrace(); } 

И читать

 try { FileInputStream fileInputStream = new FileInputStream(context.getFilesDir()+"/FenceInformation.ser"); ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream); Map myHashMap = (Map)objectInputStream.readObject(); } catch(ClassNotFoundException | IOException | ClassCastException e) { e.printStackTrace(); }