简短版:如何使用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也会太过分了。
答案 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;