在Windows应用商店应用中存储数据

时间:2013-12-18 01:38:15

标签: c# windows-store-apps store large-data

简短版:如何使用C#在Windows应用商店应用中存储“大型”数据?

长版本:我有一个json字符串,我可以将其存储为字符串(大约65 KB)或 - 当序列化时 - 作为对象存储。我原本以为我可以使用这样的东西:

    public static void SaveData(string param, object value)
    {
        Windows.Storage.ApplicationDataContainer settings = Windows.Storage.ApplicationData.Current.LocalSettings;       
        Windows.Storage.ApplicationDataCompositeValue composite = new Windows.Storage.ApplicationDataCompositeValue();
        composite[param] = value;
        settings.Values[param] = composite;
    }

我试过了,但我的应用显示以下错误:

  

WinRT信息:尝试在应用程序数据复合值中写入设置时出错

错误并没有真正帮助我,它根本不想保存我的数据。我刚刚在网上看到,只有一小部分Bytes允许使用C#存储在Windows应用商店应用的本地设置中。

是否有快速,安全和优雅的方式存储我的字符串/对象?我真的需要自己把它写成文件吗?对于这个字符串,使用SQLLite也会太过分了。

4 个答案:

答案 0 :(得分:9)

您尝试存储在本地设置容器中的数据超出限制。引自此处:ApplicationData.LocalSettings | localSettings property

  

每个设置的名称最多可以包含255个字符。每个设置的大小最多为8K字节,每个复合设置的大小最多为64K字节。

您可以使用ApplicationData.LocalFolder | localFolder来存储数据。该链接也有示例代码。

答案 1 :(得分:3)

考虑到ApplicationDataContainer的目的仅仅是针对应用设置,那么尺寸限制非常有意义。每个设置limit is 8kb;这对于应用程序设置来说已经足够了。

在文件或数据库中存储大量数据不仅仅是唯一的方法,这是正确的方法。

答案 2 :(得分:1)

为了您的帮助,我甚至在这里提供代码: - 使用LocalFolder而不是LocalSettings,如下所示。

public static class AppSystem
{
    #region FileExistsMethod
    public static async Task<bool> FileExists(string filename)
    {
        StorageFolder folder = ApplicationData.Current.LocalFolder;
        IReadOnlyList<StorageFile> list_of_files = await folder.GetFilesAsync();

        foreach(StorageFile file in list_of_files)
        {
            if (file.DisplayName == "Data")
                return true;
        }
        return false;
    }
    #endregion
    public static async Task<ObservableCollection<Notes>> GetCollection()
    {
        ObservableCollection<Notes> temp = new ObservableCollection<Notes>();

        StorageFolder folder = ApplicationData.Current.LocalFolder;

        if (await AppSystem.FileExists("Data"))
        {
            StorageFile file = await folder.GetFileAsync("Data.txt");
            using (Stream stream = await file.OpenStreamForReadAsync())
            {
                DataContractJsonSerializer json = new DataContractJsonSerializer(typeof(Notes));
                temp = (ObservableCollection<Notes>)json.ReadObject(stream);
            }
        }   
        return temp;
    }

    public static async void Save(Notes notes)
    {
        ObservableCollection<Notes> temp = new ObservableCollection<Notes>();
        StorageFolder folder = ApplicationData.Current.LocalFolder;
        bool exists = await AppSystem.FileExists("Data");

        if(exists==true)
        {
            StorageFile file = await folder.GetFileAsync("Data");
            using(Stream stream = await file.OpenStreamForReadAsync())
            {
                DataContractJsonSerializer json = new DataContractJsonSerializer(typeof(Notes));
                temp = (ObservableCollection<Notes>)json.ReadObject(stream);
            }
            await file.DeleteAsync(StorageDeleteOption.PermanentDelete);
        }

        temp.Add(notes);

        StorageFile file1 = await folder.CreateFileAsync("Data", CreationCollisionOption.ReplaceExisting);

        using(Stream stream = await file1.OpenStreamForWriteAsync())
        {
            DataContractJsonSerializer json = new DataContractJsonSerializer(typeof(Notes));
            json.WriteObject(stream, temp);
        }
    }
}

每当我希望使用保存和加载数据时,我更喜欢创建一个静态类并将所有方法放在那里,然后在需要它的地方使用它。 这里,Notes是类,我通过将它序列化为json字符串

来存储Notes对象的列表

答案 3 :(得分:-1)

Windows.Storage.ApplicationDataContainer localSettings = Windows.Storage.ApplicationData.Current.LocalSettings;

string _value="You value";

localSettings.Values["Your Variable name"]=_value;