2012-06-20 7 views
7

Piszę moją opublikowaną aplikację w Windows Phone, aby wygrać 8. Podczas próby zapisu na IsolatedStorage odpowiednik, ApplicationDataContainer, otrzymuję wyjątek. Wyjątkiem mówiRozmiar dla ApplicationDataCompositeValue

Błąd: Wielkość ustawienia menedżera państwowej przekroczył limit

Nie jestem pewien, czy jest to prawidłowy sposób korzystania z ApplicationDataContainer.

public void WriteToIsolatedStorage() 
    { 
     try 
     { 

      ApplicationDataContainer localSettings = ApplicationData.Current.LocalSettings; 
      ApplicationDataCompositeValue composite = new ApplicationDataCompositeValue(); 

      if (localSettings.Containers.ContainsKey("LoveCycleSetting")) 
      { 
       localSettings.DeleteContainer("LoveCycleSetting"); 
      } 

      composite["GetWeekStart"] = m_bWeekStart; 

      composite["iHistCount"] = m_iHistCount; 

      composite["dtHistory"] = this.DateTimeToString(m_dtHistory); 

      composite["avgCycleTime"] = m_iAvgCycleTime; 
     } 
    } 

Wyjątek występuje w drugim ostatnim wierszu. m_dtHistory to tablica ciągów o rozmiarze 400. Czy zatem ApplicationDataCompositeValue ma stały rozmiar? Czy muszę napisać tablicę m_dtHistory do pliku? Ponieważ w Windows Phone mogłem bezpośrednio napisać tablicę do IsolatedStorageSettings.

Byłoby naprawdę pomocne, gdyby ktoś mógł mnie o tym poprowadzić lub podać linki.

Alfah

+1

Jaka jest wartość [http://msdn.microsoft.com/en-US/library/windows/apps/windows.storage.applicationdata.roamingstoragequota](http://msdn .microsoft.com/en-US/library/windows/apps/windows.storage.applicationdata.roamingstoragequota) –

+0

Niemiecka wersja tego błędu to prawdopodobnie HRESULT 0x80073DC8 "Die Größe des Einstellungswerts des Zustands-Managers hat den Grenzwert überschritten" –

Odpowiedz

6

Tak, ironicznie Ustawienia pamięci jest łatwiejsze niż na telefonie WinRT. Zamiast tego możesz serializować do pliku. Oto co zrobiłem (częściowo skopiowane z kodu już w SuspensionManager.cs), który działa zarówno dla typów wartości i odniesienia.

internal static async Task<bool> SaveSetting(string Key, Object value) 
    { 
     var ms = new MemoryStream(); 
     DataContractSerializer serializer = new DataContractSerializer(value.GetType()); 
     serializer.WriteObject(ms, value); 
     await ms.FlushAsync(); 

     // Uncomment this to preview the contents being written 
     /*char[] buffer = new char[ms.Length]; 
     ms.Seek(0, SeekOrigin.Begin); 
     var sr = new StreamReader(ms); 
     sr.Read(buffer, 0, (int)ms.Length);*/ 

     ms.Seek(0, SeekOrigin.Begin); 
     StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync(Key, CreationCollisionOption.ReplaceExisting); 
     using (Stream fileStream = await file.OpenStreamForWriteAsync()) 
     { 
      await ms.CopyToAsync(fileStream); 
      await fileStream.FlushAsync(); 
     } 
     return true; 
    } 

    // Necessary to pass back both the result and status from an async function since you can't pass by ref 
    internal class ReadResults 
    { 
     public bool Success { get; set; } 
     public Object Result { get; set; } 
    } 
    internal async static Task<ReadResults> ReadSetting<type>(string Key, Type t) 
    { 
     var rr = new ReadResults(); 

     try 
     { 
      var ms = new MemoryStream(); 
      DataContractSerializer serializer = new DataContractSerializer(t); 

      StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync(Key); 
      using (IInputStream inStream = await file.OpenSequentialReadAsync()) 
      { 
       rr.Result = (type)serializer.ReadObject(inStream.AsStreamForRead()); 
      } 
      rr.Success = true; 
     } 
     catch (FileNotFoundException) 
     { 
      rr.Success = false; 
     } 
     return rr; 
    } 
0

Czytałem gdzieś, ale stracił odniesienie, że rozmiar jest 64KB

+1

nie , nie może nawet obsłużyć danych 20KB – balint

+0

Myślę, że ma rację, że suma dla wszystkich wartości wynosi 64 kilobajtów. Jednak maksymalna wartość poszczególnych wartości może być znacznie mniejsza. –

Powiązane problemy