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