【问题标题】:Windows 8 App Local StorageWindows 8 应用本地存储
【发布时间】:2013-04-17 21:08:46
【问题描述】:

我正在尝试使用 C# 开发 Windows 8 应用程序,我需要在本地设置中存储两个列表(字符串和日期时间)

List<string> names = new List<string>();
List<DateTime> dates = new List<DateTime>();

我根据这个页面使用了 LocalSettings:http://msdn.microsoft.com/en-us/library/windows/apps/xaml/hh700361

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

但我在存储列表并从保存的设置中取回它们时遇到问题。

您能否通过发送几行来存储和检索字符串 List 和 DateTime 列表类型对象(或存储此类数据的其他方法)来提供帮助。

谢谢。

【问题讨论】:

    标签: c# windows windows-8 windows-runtime local-storage


    【解决方案1】:

    这是一个名为Windows 8 Isolated storage 的库,它使用XML 序列化。您可以存储object 以及List&lt;T&gt;。使用也非常简单。只需在您的项目中添加 DLL,您就有了存储数据的方法。

    public class Account
    {
       public string Name { get; set; }
       public string Surname{ get; set; }
       public int Age { get; set; }
    }
    

    保存在隔离存储中:

    Account obj = new Account{ Name = "Mario ", Surname = "Rossi", Age = 36 };
    var storage = new Setting<Account>();          
    storage.SaveAsync("data", obj); 
    

    从隔离存储加载:

    public async void LoadData()
    {    
        var storage = new Setting<Account>();
        Account obj = await storage.LoadAsync("data");    
    }
    

    如果你想存储 List : 将列表保存在独立存储中:

    List<Account> accountList = new List<Account>();
    accountList.Add(new Account(){ Name = "Mario", Surname = "Rossi", Age = 36 });
    accountList.Add(new Account(){ Name = "Marco", Surname = "Casagrande", Age = 24});
    accountList.Add(new Account(){ Name = "Andrea", Surname = "Bianchi", Age = 43 });
    
    var storage = new Setting<List<Account>>(); 
    storage.SaveAsync("data", accountList ); 
    

    从独立存储中加载列表:

    public async void LoadData()
    {    
        var storage = new Setting<List<Account>>();    
        List<Account> accountList = await storage.LoadAsync("data");    
    }
    

    【讨论】:

      【解决方案2】:

      请查看此示例,它演示了如何将集合保存到应用程序存储:http://code.msdn.microsoft.com/windowsapps/CSWinStoreAppSaveCollection-bed5d6e6

      【讨论】:

        【解决方案3】:

        试试这个来存储:

        localSettings.Values["names"] = names 
        localSettings.Values["dates"] = dates
        

        然后阅读:

        dates = (List<DateTime>) localSettings.Values["dates"];
        

        编辑:看来我错了,您只能以这种方式存储基本类型。因此,您可能必须使用 MemoryStream 将所有内容序列化为 byte[] 并仅保存其缓冲区。

        【讨论】:

        • 代码看起来是对的,但我试过了。应用程序正确启动,但在运行时我收到此错误:mscorlib.dll 中出现“System.Exception”类型的异常,但未在用户代码中处理 WinRT 信息:尝试序列化要写入应用程序数据存储的值时出错附加信息:不支持这种类型的数据。如果有这个异常的处理程序,程序可以安全地继续。
        • 我遇到了同样的问题。似乎问题出在尝试持久化 DateTime 时,因为在 c# 中它不是运行时类型(DateTimeOffset 是)...似乎方法是将 DateTime 从和到 DateTimeOffset 转换...必须有一个更优雅的解决方案.在 WP8 隔离存储中工作正常
        • var applicationData = Windows.Storage.ApplicationData.Current; var localSettings = applicationData.LocalSettings;
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多