2016-08-22 1 views
0

Ich habe eine Anwendung auf dem Google Play Store. In dieser Anwendung speichere ich einige Daten in einer Datei (Datenbank wäre besser, würde aber jetzt mehr Arbeit bedeuten). Das funktioniert einwandfrei, aber das Problem ist, dass wenn ich Version 2 zum Beispiel ausführe und ich Daten in einer Datei speichere, kann ich es zurückbekommen. Aber wenn ich dann auf Version 3 aktualisiere, werden die Daten nicht geladen, aber die Datei existiert immer noch im Dateiverzeichnis der Anwendungen. Diese Datei wird im internen Speicher des Geräts gespeichert. Jetzt weiß ich nicht, warum das passiert, aber ich lese im Internet, dass eine andere sharedUserId die Ursache sein könnte, aber ich habe keine sharedUserId in meinem Manifest. Ich weiß, dass Android dann einen erzeugen wird, aber ist dieser immer derselbe? Selbst wenn die App auf einem anderen Computer kompiliert ist? Kann jemand helfen?Datei im internen Speicher von Android nicht lesbar nach dem Update

Vielen Dank im Voraus!

EDIT

Einige Codes, den ich verwende, um die Datei zu lesen und schreiben:

zu schreiben:

try { 
      FileOutputStream fos = context.openFileOutput(fileName, Context.MODE_PRIVATE); 
      ObjectOutputStream os = new ObjectOutputStream(fos); 
      os.writeObject(object); 
      os.close(); 

     } catch (IOException e) { 
      LogUtils.e(IoUtils.class.getSimpleName(), e.getMessage()); 
     } finally { 

     } 

zu lesen:

try { 
      FileInputStream fis = context.openFileInput(fileName); 
      ObjectInputStream is; 
      is = new ObjectInputStream(fis); 
      Serializable objectOut = (Serializable) is.readObject(); 
      is.close(); 
      return objectOut; 
     } catch (StreamCorruptedException e) { 
      LogUtils.e(IoUtils.class.getSimpleName(), e.getMessage()); 
     } catch (IOException e) { 
      LogUtils.e(IoUtils.class.getSimpleName(), e.getMessage()); 
     } catch (ClassNotFoundException e) { 
      LogUtils.e(IoUtils.class.getSimpleName(), e.getMessage()); 
     } 
     return null; 

Nach dem Update nichts scheint aus dieser Datei herauszukommen, aber ich bekomme keine Fehler entweder. Mit einem ROOT-Datei-Explorer kann ich nach/data/data/myApp/files/gehen und dort finde ich die Datei, die die gleiche Größe wie vor dem Update hat.

+0

"Ich weiß, dass Android dann eine generieren wird, aber ist diese immer die gleiche?" - Ja, für ein bestimmtes Gerät. "Auch wenn die App auf einem anderen Computer kompiliert ist?" - Ja, das sollte keine Rolle spielen. Android erstellt die Benutzer-ID, nicht die Entwicklungstools. Welches Gerät und welches Gerät ist das? – CommonsWare

+0

Getestet auf 2 Geräten und beide haben das Problem – Allinone51

+0

OK ... was macht und Modelle sind diese dann? – CommonsWare

Antwort

1

Serialisierbar ohne jegliche Anpassung, sollte nicht für die Langzeitspeicherung verwendet werden, da sich das Format des Objekts zwischen den App-Versionen ändern kann. Ich nehme an, dass Sie dem Objekt in der neuen Version eine Variable hinzugefügt haben (oder ein Bibliotheksobjekt geändert wurde), und deshalb ist Ihre Serializable-Version fehlerhaft.
Was sollten Sie tun, ist

durch Überschreiben Funktionen benutzerdefinierte Serialisierung verwenden
private void writeObject(java.io.ObjectOutputStream out) throws IOException` 

private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException; 

private void readObjectNoData() throws ObjectStreamException; 

die alten Daten abzurufen, die Serialisierung genau das alte Format zu lesen, ändern. Sie sollten auch in Zukunft eine Versionskennung in die Serialisierung einfügen, damit Sie sie korrekt lesen können.
All dies ist sehr chaotisch, und in der Regel sind Sie viel besser speichern in JSON (oder XML), die viel robuster sein wird.

+0

Ich werde das überprüfen! Danke – Allinone51

+0

Der Paketname änderte zwischen 2 Updates, kann das die Ursache sein? – Allinone51

+0

Kann man parzellierbare Objekte in einer Datei speichern? – Allinone51

Verwandte Themen