前不久我们讲过".NET平台开发Windows Phone 7、iPhone及Android应用",在新的更新包内微软给Windows Phone 7增加了一项独立存储的概念,就是在移动智能设备中存储本地数据的方法 。
什么是独立存储?
独立存储不是一个新概念 。在Silverlight 2中已经在使用了 。本质上说这是一种在本地文件系统中存储数据或文件的方式 。“独立(isolated)”是因为只有你的程序才可以访问这些数据 。如果你有两个应用程序,同时你想在它们之间共享数据的话,最好使用一些类似基于云的可以让你共享数据的服务 。一个应用程序不能共享,调用设备上其他的应用程序或与之进行交互 。 在文件的存储上,MonoTouch和MonoDroid可以直接像本地路径写入数据,而在Windows Phone 7上则必须使用独立存储:
- void SaveLocal(string data)
- {
- #if (MonoTouch || MonoDroid)
- File.WriteAllText(_localPath, data);
- #elif WINDOWS_PHONE
- using (var appStorage =
- IsolatedStorageFile.GetUserStoreForApplication())
- {
- var file = appStorage.OpenFile(_localPath, FileMode.Create);
- FileExtension.WriteAllText(file, data);
- }
- #endif
- }
-
设置和文件
有两种方式在本地存储你的数据 。第一是通过库中的键/值对,叫做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;
- }
- }
- }
-
正如你所见,这非常简单 。请记住以下内容:
如果还没在IsolatedStorageSettings中创建就读取它的值会抛出一个异常 。确认你已经初始化了设置,或者总是使用Contains方法先检查一下 。
你可以在设置中保存任意内容 。在我的例子中,我保存了一个布尔值,但你可以保存一个客户对象,或者任何你能想到的 。
记住当你读取数据时你需要将它显示强制转换 。你会看到我在使用之前将数据转换为bool值 。虽然你保存了对象,但并没有保存它的类型 。是否能看到类型取决于你自己 。
设置一个值和在库中添加它效果是一样 。“settings.Add()”的语句实际上不是必需的,我添加它是为了让你看清语法 。
就这些 。IsolatedStorageSettings非常简单 。只用极少的代码就可保存键/值对 。创建和保存文件相对略复杂一些,但还是十分简单 。
IsolatedStorageFile
使用IsolatedStorageFile是一种让你可以在用户的设备中存储真实文件的机制 。在我的例子中,在一个子目录中创建了一个文本文件,并读取文件中的内容 。我们还可以创建和删除目录,子目录及文件 。看起来有很多代码,但实际上非常简单 。我们创建一个新的IsolatedStorageFile对象,并使用一个IsolatedStorageFileStream对象将它写入到驱动器中 。我在代码中加入了注释,这样你可以更清楚地看到发生了什么 。有两个事件处理程序,一个用来保存文件,另一个读取:
- using System.IO.IsolatedStorage;
- using System.IO;
-
- private void SaveButton_Click(object sender, RoutedEventArgs e)
- {
- //Obtain a virtual store for application
- IsolatedStorageFile fileStorage = IsolatedStorageFile.GetUserStoreForApplication();
-
- //Create new subdirectory
- fileStorage.CreateDirectory("textFiles");
-
- //Create a new StreamWriter, to write the file to the specified location.
- StreamWriter fileWriter = new StreamWriter(new IsolatedStorageFileStream("textFiles\\newText.txt", FileMode.OpenOrCreate, fileStorage));
- //Write the contents of our TextBox to the file.
- fileWriter.WriteLine(writeText.Text);
- //Close the StreamWriter.
- fileWriter.Close();
- }
-
- private void GetButton_Click(object sender, RoutedEventArgs e)
- {
- //Obtain a virtual store for application
- IsolatedStorageFile fileStorage = IsolatedStorageFile.GetUserStoreForApplication();
- //Create a new StreamReader
- StreamReader fileReader = null;
-
- try
- {
- //Read the file from the specified location.
- fileReader = new StreamReader(new IsolatedStorageFileStream("textFiles\\newText.txt", FileMode.Open, fileStorage));
- //Read the contents of the file (the only line we created).
- string textFile = fileReader.ReadLine();
-
- //Write the contents of the file to the TextBlock on the page.
- viewText.Text = textFile;
- fileReader.Close();
- }
- catch
- {
- //If they click the view button first, we need to handle the fact that the file hasnt been created yet.
- viewText.Text = "Need to create directory and the file first.";
- }
- }
-
离开程序时这多像一个迷人的魔术,再回来时,会再次载入文件(它还在那儿!) 。
你都知道了 。现在我们在Windows Phone 7中有两种存储机制可以用 。IsolatedStorageSettings和IsolatedStorageFile 。我们非常希意听到你在程序中使用这两种存储结构的创新用法,与我们一同分享 。