2013-06-13 10 views
6

Ich habe das folgende seltsame Verhalten in meinem Windows Phone 8, C# App.Windows Phone 8, Anwendungseinstellungen nicht beibehalten

Ich spare eine Einstellung mit:

private void SaveProperty<T>(T property, string propertyName) 
    { 
     if (IsolatedStorageSettings.ApplicationSettings.Contains(propertyName)) 
      IsolatedStorageSettings.ApplicationSettings[propertyName] = property; 
     else 
      IsolatedStorageSettings.ApplicationSettings.Add(propertyName, property); 

     IsolatedStorageSettings.ApplicationSettings.Save(); 
    } 

Wenn die App läuft, habe ich alle Einstellungen, die ich in IsolatedStorageSettings.ApplicationSettings gespeichert lesen kann.

Aber wenn ich meine App wieder öffne (öffnen Sie es aus der App-Liste), enthält das IsolatedStorageSettings.ApplicationSettings -Dictionary Null (0) Schlüssel und Werte.

Fehle ich etwas?

Ich habe die ISETool.exe verwendet, um Schnappschüsse von der IsolatedStorage meiner App (dank Chepen) zu machen. Ich sah dieses Verhalten: als ich die Einstellungen schrieb (das heißt, nachdem die SaveProperty<T>() Funktion beendet), und die App noch läuft, habe ich die Einstellungen in _ApplicationSettings gespeichert. Dies stimmt mit meiner Beobachtung überein, dass ich von der IsolatedStorageSettings.ApplicationSettings lesen kann, wenn die App läuft. Die _ApplicationSettings-Datei existiert auch, wenn die Datei versteinert ist oder nicht läuft (wenn ich auf sie zugreifen kann, indem ich die Zurück-Taste des Telefons und halte, wenn die App mit der Zurück-Taste geschlossen wird).

Aber wenn der App wieder geöffnet wird (über die App-Liste), die _ApplicationSettings -datei ist weg ...

Ich sehe auch, dass, wenn ich eine Datei in die IsolatedStorage mit dem Schreiben:

SharedStorageAccessManager.CopySharedFileAsync(
    Windows.Storage.ApplicationData.Current.LocalFolder, fileName+"orig", 
    Windows.Storage.NameCollisionOption.ReplaceExisting, fileID); 

und wenn ich dann diese Datei nicht lese, ist es verschwunden, wenn ich die App das nächste Mal öffne.

Übrigens, um Verwirrung zu vermeiden: Ich bin nicht Neuinstallation der App jedes Mal, wenn ich es öffne.

Wenn Sie weitere Informationen benötigen, fragen Sie bitte.

Jede Hilfe wird geschätzt.

+0

verwenden Sie Emulator oder ein Gerät? Wenn Sie einen Emulator verwenden, verlassen Sie die Anwendung, indem Sie die Visual Studio-Debugsitzung oder die Schaltfläche "Zurück" im Emulator anhalten? –

+0

Nach der 'Save()' Methode, schauen Sie (mit Isolated Storage Explorer), welche Dateien in Ihrem App-isolierten Speicher vorhanden sind. – Chepene

+0

@Beytan Kurt: Ich benutze ein Gerät, aber ich habe auch den Emulator überprüft: das gleiche Verhalten. Ich verlasse die App nicht direkt, anstatt sie erneut zu öffnen, indem ich sie aus der App-Liste öffne. –

Antwort

0

Dank Quetzalcoatl habe ich die Lösung gefunden: Ich speichere alle meine Dateien im Stammordner meiner App. Zu Beginn lese ich dann alle meine Dateien (über einen DataContractSerializer) und wirf es in mein Modell. Da es manchmal passiert, dass meine Dateien beschädigt werden, lösche ich jede Datei, die eine SerialzationException auslöst. Aber wie ich jede Datei lese, und da _ApplicationSettings nicht zu meinem Modell castable ist, lösche ich _ApplicationSettings automatisch .... So lernte ich, dass die ApplicationSettings nur eine Datei im Stammordner sind, die ich lesen darf und löschen. Die Quintessenz besteht also darin, niemals in den Stammordner zu schreiben.

+0

Großartig! Ich bin froh, dass du es gefunden hast und dass es kein weiteres seltsames WPhone-Verhalten war :) Denk daran, deine Antwort als "akzeptiert" zu markieren (das "V" -Zeichen), damit jeder weiß, dass es gelöst ist. – quetzalcoatl

+0

Ich kann ny eigene Antwort als "akzeptiert" in 48h markieren. Aber dann werde ich das machen;) –

3

Mit AppSettings habe ich etwas ähnliches auf WP7/7.5 gesehen, aber es passierte nur, wenn der Typ meines Eigenschaftswerts eine Klasse war, die dem Serializer nicht bekannt war.

Sind Sie sicher, dass es keine Ausnahmen waren:

  • während Speichern
  • während App Exit (da die App an diesem Punkt die Einstellungen Dump kann)
  • während der Zeit, App die Einstellungen lädt zum ersten Mal nach dem Start?

Beachten Sie, dass dies nicht unbedingt bedeutet, dass die App abstürzt. Ich meine, alle Ausnahmen, die intern stummgeschaltet oder von Benutzern bearbeitet werden. Überprüfen Sie das Ausgabefenster von VisualStudio auf das Protokoll "Erste Chance Ausnahmen". Wenn eine E/A- oder Sicherheits- oder Serialisierungsausnahme auftritt, suchen Sie dort nach. Wenn ich mich gut erinnere, gibt es sogar eine ganze Reihe von isolierten Speicherausnahmen, die leicht vom Debug/Exceptions-Menü abgehört werden können.

Die Probleme, die ich mit unbekannten oder nicht serialisierbaren Typen hatte, erklären jedoch überhaupt nicht, warum Ihre zusätzlichen Nicht-Appsettings-Dateien verdampfen würden.

Ein anderer Gedanke: vielleicht führt ein zusätzliches Tool so etwas wie "clean deploy" für Sie durch? Ich erinnere mich nicht genau, aber ich denke, dass Visual Studio unter Deployment-Zyklus ganz klar war:

  • entfernen umbauen/deinstallieren alte App vom Gerät - so wahrscheinlich Säuberungen IsolatedStorage
  • neue App installieren auf Gerät

Also, vielleicht ist das die Ursache? Hm .. Nachher eingeredet und deine Frage noch einmal gelesen, hast du über das Ausführen der App aus der Applist gesagt, damit ist das eher nicht der Fall. Achten Sie darauf, die ersten Ausnahmen zu prüfen!

+0

Ich habe eine 'System.Runtime.Serialization.SerializationException' in' System.Runtime.Serialization.ni.dll'. Aber jetzt habe ich gerade versucht: 'IsolatedStorageSettings.ApplicationSettings.Add (" test "," testwert ");' Ich habe keine ausgefallenen Dinge gemacht. Fügen Sie einfach eine einfache Zeichenfolge hinzu. Das kann nicht zu schwer für den Serializer sein ... Also, was kann ich tun, jetzt, wo ich diese Ausnahme gesehen habe? Warten Sie, ich habe vergessen zu sagen, dass diese Ausnahme auftritt, wenn die App startet. Nicht wenn die Einstellungen gespeichert sind ... –

+1

Lassen Sie uns versuchen, es abzufangen und zu überprüfen, was die Nachricht sagt. Stoppen Sie die App, gehen Sie zu VisualStudio, zum Debuggen-Menü, dann 'Ausnahmen ..', dann suchen Sie in der Baumstruktur den Namespace und die Exception und überprüfen Sie das "When geworfen". Versuchen Sie nun, die App ein oder zwei Mal über 'Debug' zu starten. Wenn die Ausnahme angezeigt wird, hat der Debugger die große Chance, sofort zu stoppen. Wenn es passiert, erhalten Sie den typischen 'Ausnahmeassistent' und Sie können die Nachricht lesen, den StackTrace überprüfen und so weiter. – quetzalcoatl

+0

Der einzige "Debug" löscht jedoch möglicherweise alte App-Einstellungen. Ich kann mich nicht daran erinnern, tut mir leid. Aber ich bin mir ziemlich sicher, dass ich meine SerializationExceptions genau abgefangen und untersucht habe (aber meine waren bei AppQuit und nicht bei AppStart). – quetzalcoatl