Как я могу хранить структуру данных, такую как 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. Спасибо заранее.

3 ответов


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();

+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();
}

пишем:

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

чтение выполняется обратным образом и приведение к вашему типу в readObject