Windows Phone笔记(11)使用独立存储(下)

Windows Phone笔记(11)使用独立存储(下)

 

  Windows Phone更新到Mango(SDK 7.1)之后,我们可以将关系数据存储在驻留在应用程序独立存储容器的本地数据库中。Windows Phone应用程序使用LINQ to SQL对数据库进行操作。LINQ to SQL 用于定义数据库架构、选择数据,并将更改保存到驻留在独立存储中的基础数据库文件。LINQ to SQL对象模型主要是由System.Data.Linq.DataContext对象构成,可充当本地数据库代理。下图是LINQ to SQL 和本地数据库的关系说明:

使用 LINQ to SQL 将关系数据存储在本地数据库中

  下面我们通过简单的示例程序来学习如何在Windows Phone开发中使用本地数据库对数据进行保存。该实例只有一个MainPage页面,作为一个任务列表,我们可以把我们的任务添加到本地数据库中,也可以对本地数据库进行查询,通过Dialog把本地数据库中的数据显示出来。

首先当然还是给出我们的MainPage.xaml页面代码:

复制代码
 1         <!--ContentPanel - 在此处放置其他内容-->
2 <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
3 <StackPanel>
4 <Grid Height="300">
5 <StackPanel Orientation="Horizontal">
6 <TextBox Height="72" HorizontalAlignment="Left" Name="txtNewTask" Text="新任务" Width="325"
7 VerticalAlignment="Top"/>
8 <Button Content="增加" Height="72" Name="btnAddNewTask" Width="128" VerticalAlignment="Top" Click="btnAddNewTask_Click" />
9 </StackPanel>
10 </Grid>
11 <Grid Height="300">
12 <Button Content="查询" Height="72" Name="btnQuery" Click="btnQuery_Click"
13 VerticalAlignment="Bottom" Grid.ColumnSpan="2" />
14 </Grid>
15 </StackPanel>
16 </Grid>
复制代码

如果需要创建本地数据库,必须首先定义一个实体类,它代表了本地数据库中的一张ToDoItem表:

复制代码
 1      /// <summary>
2    /// 代表数据库中的表
3    /// </summary>
4 [Table]
5 public class ToDoItem
6 {
7 //私有字段,公有属性、数据表列
8 private int _toDoItemId;
9 [Column(IsPrimaryKey = true, IsDbGenerated = true, DbType = "INT NOT NULL Identity", CanBeNull = false, AutoSync = AutoSync.OnInsert)]
10 public int ToDoItemId
11 {
12 get
13 {
14 return _toDoItemId;
15 }
16 set
17 {
18 if (_toDoItemId != value)
19 {
20 _toDoItemId = value;
21 }
22 }
23 }
24
25 // 定义任务名称: 私有字段,公有属性 和数据库列
26 private string _itemName;
27
28 [Column]
29 public string ItemName
30 {
31 get
32 {
33 return _itemName;
34 }
35 set
36 {
37 if (_itemName != value)
38 {
39 _itemName = value;
40 }
41 }
42 }
43 }
复制代码

然后定义非常重要的创建数据上下文(DataContext)对象的类,该类继承自DataContext类。

复制代码
 1     /// <summary>
2   /// 该代码将调用基构造函数并声明名为 ToDoItems 的数据库表。
3   /// </summary>
4 public class ToDoDataContext : DataContext
5 {
6 // 定义一个连接字符串,在MainPage和App页面中使用
7 public static string DBConnectionString = "Data Source=isostore:/ToDo.sdf";
8
9 // 传递连接字符串
10 public ToDoDataContext(string connectionString)
11 : base(connectionString)
12 { }
13
14 // 定义一个任务列表
15 public Table<ToDoItem> ToDoItems;
16 }
复制代码

只有创建了前面的DataContext对象后,我们才能够开始创建本地数据库。为了使我们的程序在运行之前数据库就已经存在我们需要在App类的构造函数内的末尾添加这段创建本地数据库的代码:

复制代码
 1             //此处将添加数据库创建代码,以便在主页中代码运行之前数据库便已存在。
2 // 如果数据库不存在,则创建它
3 using (ToDoDataContext db = new ToDoDataContext(ToDoDataContext.DBConnectionString))
4 {
5 if (db.DatabaseExists() == false)
6 {
7 //创建数据库
8 db.CreateDatabase();
9 }
10 }
复制代码

最后是我们MainPage.xaml.cs的后台处理代码:

复制代码
 1  public partial class MainPage : PhoneApplicationPage
2 {
3 // 本地数据库的上下文
4 private ToDoDataContext toDoDB;
5
6 // 构造函数
7 public MainPage()
8 {
9 InitializeComponent();
10 //实例化数据库的上下文实例
11 toDoDB = new ToDoDataContext(ToDoDataContext.DBConnectionString);
12 }
13
14 /// <summary>
15      /// 在数据库中增加一个新列
16      /// </summary>
17     /// <param name="sender"></param>
18      /// <param name="e"></param>
19 private void btnAddNewTask_Click(object sender, RoutedEventArgs e)
20 {
21 //创建一个新的任务列表
22 ToDoItem newToDo = new ToDoItem { ItemName = txtNewTask.Text };
23
24 //把任务添加到数据库中
25 toDoDB.ToDoItems.InsertOnSubmit(newToDo);
26
27 //保存数据库改变
28 toDoDB.SubmitChanges();
29 }
30
31 /// <summary>
32      /// 查询数据库
33      /// </summary>
34      /// <param name="sender"></param>
35      /// <param name="e"></param>
36 private void btnQuery_Click(object sender, RoutedEventArgs e)
37 {
38 IEnumerable<ToDoItem> toDoItemsInDB = from ToDoItem todo in toDoDB.ToDoItems select todo;
39
40 string txt = string.Empty;
41
42 foreach (var items in toDoItemsInDB)
43 {
44 txt += items.ItemName + "\n";
45 }
46
47 MessageBox.Show(txt, "查询数据库", MessageBoxButton.OK);
48 }
49 }
复制代码

编译运行程序:

 添加任务,存入数据库中            退出程序后,查询数据库

  

附:源码下载

参考资料:

  http://msdn.microsoft.com/zh-cn/library/hh202860(v=vs.92).aspx(重要)

  http://msdn.microsoft.com/zh-cn/library/hh202876(v=vs.92).aspx

  http://msdn.microsoft.com/zh-cn/library/hh286406(v=vs.92).aspx(重要)

    http://msdn.microsoft.com/zh-cn/library/hh202872(v=vs.92).aspx

作者:晴天猪

出处:http://www.cnblogs.com/IPrograming 

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

原文地址:https://www.cnblogs.com/zhanghaifeng/p/2480927.html