2013-07-18 2 views
6

In meiner Android-Anwendung versuche ich eine Map-Struktur wie: Map<String, Map<String, String>> mit internen Speicher zu speichern. Ich habe mit SharedPreferences untersucht, aber wie Sie wissen, funktioniert dies nur beim Speichern von primitiven Datentypen. Ich habe versucht, zu verwenden, aber es lässt mich nur in Bytes schreiben ... Würde ich irgendwie die Hashmap serialisieren und dann in Datei schreiben müssen?Wie kann ich eine Datenstruktur wie eine Hashmap intern in Android speichern?

Ich habe versucht, durch http://developer.android.com/guide/topics/data/data-storage.html#filesInternal lesen, aber ich kann nicht scheinen, meine Lösung zu finden.

Hier ist ein Beispiel dafür, was ich zu tun habe versucht:

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

} 

Was ist der beste Ansatz, um diese Art einer Datenstruktur intern in einem Android-App zum Speichern? Sorry, wenn das wie eine dumme Frage scheint, bin ich sehr neu in Android. Danke im Voraus.

Antwort

14

HashMap serializable in readObject- auf Ihre Art Casting ist, so dass Sie nur eine FileInputStream und FileOutputStream in Verbindung mit ObjectInputStream und ObjectOutputStream nutzen könnten .

Um Ihre HashMap in eine Datei zu schreiben:

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

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

die HashMap aus einer Datei zu lesen:

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

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

Schreiben:

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

Lesen in der umgekehrten Art und Weise durchgeführt wird und

0

+1 für die Antwort von Steve P aber es direkt nicht funktioniert, und während ich das Lesen bekomme eine FileNotFoundException, ich habe es versucht und es funktioniert gut.

zu schreiben,

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

Und

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