本文是“Windows Phone 7 开发 31 日谈”系列的第15日。
昨天,我们讨论了程序中的墓碑机制从而让程序看起来是可以在后台运行的。今天,我们来谈谈在电话中存储本地数据的一种非常棒的方法。使用独立存储。
什么是独立存储?
独立存储不是一个新概念。在Silverlight 2中已经在使用了。本质上说这是一种在本地文件系统中存储数据或文件的方式。“独立(isolated)”是因为只有你的程序才可以访问这些数据。如果你有两个应用程序,同时你想在它们之间共享数据的话,最好使用一些类似基于云的可以让你共享数据的服务。一个应用程序不能共享,调用设备上其他的应用程序或与之进行交互。
设置和文件
有两种方式在本地存储你的数据。第一是通过库中的键/值对,叫做IsolatedStorageSettings。第二是通过创建真实的文件和目录,叫做IsolatedStorageFile。下图简要介绍了这些(由MSDN提供),我会为每种方式提供一个深入的例子。
IsolatedStorageSettings
有很多时候,这可能是你需要的唯一存储方式。IsolatedStorageSettings允许你在一个字典中存储键/值对(注意,无需任何设定),然后再读取出来。这些数据会一直保存着,无论应用程序停止/启动,或者关机等等。除非你删除它,或者用户卸载你的应用程序,否则它一直存在。要记住的一点是在它被添加到字典中之前你无法读取它。在我的每个例子中,你都会看到在读取数据之前检查值是否它存在的代码。下面的例子是在用户在你的程序中接收电子邮件更新时需要保存用户设定的代码。我用了一个多选框允许用户选择,还有一个将此值保存到独立存储中的事件。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using System.IO.IsolatedStorage;
namespace Day15_IsolatedStorage
{
public partial class MainPage : PhoneApplicationPage
{
IsolatedStorageSettings settings = IsolatedStorageSettings.ApplicationSettings;
// Constructor
public MainPage()
{
InitializeComponent();
InitializeSettings();
}
private void InitializeSettings()
{
if (settings.Contains("emailFlag"))
{
EmailFlag.IsChecked = (bool)settings["emailFlag"];
}
else settings.Add("emailFlag", false);
}
private void EmailFlag_Unchecked(object sender, RoutedEventArgs e)
{
settings["emailFlag"] = false;
}
private void EmailFlag_Checked(object sender, RoutedEventArgs e)
{
settings["emailFlag"] = true;
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using System.IO.IsolatedStorage;
namespace Day15_IsolatedStorage
{
public partial class MainPage : PhoneApplicationPage
{
IsolatedStorageSettings settings = IsolatedStorageSettings.ApplicationSettings;
// Constructor
public MainPage()
{
InitializeComponent();
InitializeSettings();
}
private void InitializeSettings()
{
if (settings.Contains("emailFlag"))
{
EmailFlag.IsChecked = (bool)settings["emailFlag"];
}
else settings.Add("emailFlag", false);
}
private void EmailFlag_Unchecked(object sender, RoutedEventArgs e)
{
settings["emailFlag"] = false;
}
private void EmailFlag_Checked(object sender, RoutedEventArgs e)
{
settings["emailFlag"] = true;
}
}
}