2013-07-18 7 views
6

W mojej aplikacji dla systemu Android próbuję zapisać strukturę mapy, taką jak: Map<String, Map<String, String>> przy użyciu pamięci wewnętrznej. Przyjrzałem się przy użyciu SharedPreferences, ale jak wiadomo, działa to tylko podczas przechowywania podstawowych typów danych. Próbowałem użyć FileOutputStream, ale pozwala mi to tylko pisać w bajtach ... Czy muszę jakoś serializować Hashmap, a następnie pisać do pliku?Jak mogę przechowywać strukturę danych, taką jak HashMap wewnętrznie w systemie Android?

Próbowałem czytać przez http://developer.android.com/guide/topics/data/data-storage.html#filesInternal, ale nie mogę znaleźć mojego rozwiązania.

Oto przykład tego, co próbuję zrobić:

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.. 

} 

Co jest najlepszym rozwiązaniem do przechowywania tego typu struktury danych wewnętrznie w aplikacji na Androida? Przepraszam, jeśli wydaje się to głupie pytanie, jestem bardzo nowy na Androida. Z góry dziękuję.

Odpowiedz

14

HashMap jest serializacji, więc można po prostu użyć FileInputStream i FileOutputStream w połączeniu z ObjectInputStream i ObjectOutputStream .

napisać HashMap do pliku:

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

objectOutputStream.writeObject(myHashMap); 
objectOutputStream.close(); 

Aby przeczytać HashMap z pliku:

FileInputStream fileInputStream = new FileInputStream("myMap.whateverExtension"); 
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream); 

Map myNewlyReadInMap = (HashMap) objectInputStream.readObject(); 
objectInputStream.close(); 
0

Pisanie:

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

Odczyt odbywa się w odwrotny sposób i oddające do danego typu w readObject

0

+1 za odpowiedź Steve P, ale to nie działa bezpośrednio i podczas czytania I uzyskać FileNotFoundException, próbowałem tego i działa dobrze.

pisać,

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

I czytać

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(); 
} 
Powiązane problemy