Windows Phone学习笔记(4) — — 本地数据库操作
使用 Windows Phone OS 7.1,可以将关系数据存储在驻留在应用程序独立存储容器的本地数据库中。Windows Phone 应用程序使用 LINQ to SQL 执行所有数据库操作;LINQ to SQL 用于定义数据库架构、选择数据,并将更改保存到驻留在独立存储中的基础数据库文件。为了存储和检索本地数据库中的数据,Windows Phone 应用程序使用 LINQ to SQL。LINQ to SQL 为处理数据提供了一种面向对象的方法,它由一个对象模型和运行时组成。LINQ to SQL 对象模型主要是由 System.Data.Linq.DataContext 对象构成,可充当本地数据库的代理。LINQ to SQL 运行时负责桥接对象部分(DataContext 对象)和数据部分(本地数据库)。他们的关系如下
若要创建本地数据库,则首先要创建数据上下文。数据上下文代表一个数据库对象,数据上下文的每一个对象都对应数据库的一个Table。Windows Phone 应用程序可以通过 LINQ to SQL 使用本地数据库选择、插入、更新和删除数据。由于手机所具有的资源少于 PC,因此本地数据库和典型数据库在某些方面存在一些差异:
- 本地数据库将会在 Windows Phone 应用程序的进程中运行。和客户端服务器数据库不同(如 Microsoft SQL Server),它不会作为后台服务持续运行。
- 本地数据库仅可由对应的 Windows Phone 应用程序访问。由于数据库文件驻留在独立存储中,因此其他应用程序无法访问该数据。
- 本地数据库仅可通过 LINQ to SQL 访问;Transact-SQL 不受支持。
下面我们来创建一个Linq数据上下文对象:
public class ModelContext : DataContext { public ModelContext(string connectionString) : base(connectionString) { } public Table<Student> StudentItem; }
在这个数据上下文对象中只包含一个Student的Table对象。Student如下:
[Table] public class Student : INotifyPropertyChanged, INotifyPropertyChanging { private int id; [Column(IsPrimaryKey = true, IsDbGenerated = true, DbType = "INT NOT NULL Identity", CanBeNull = false, AutoSync = AutoSync.OnInsert)] public int Id { get { return id; } set { id = value; } } private string name; [Column] public string Name { get { return name; } set { name = value; } } #region INotifyPropertyChanged Members public event PropertyChangedEventHandler PropertyChanged; // Used to notify that a property changed //通知更改的属性 private void NotifyPropertyChanged(string propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } #endregion #region INotifyPropertyChanging Members public event PropertyChangingEventHandler PropertyChanging; // Used to notify that a property is about to change private void NotifyPropertyChanging(string propertyName) { if (PropertyChanging != null) { PropertyChanging(this, new PropertyChangingEventArgs(propertyName)); } } #endregion }
现在我们创建一个Model类,给数据库添加三条数据,并把数据查询显示出来。我们要先创建一个Student的ObservableCollection<T>对象StudentItem,并且把查询到的数据放入到StudentItem中。
public class Model : INotifyPropertyChanged { ModelContext context; public Model(string toDoDBConnectionString) { context = new ModelContext(toDoDBConnectionString); } private ObservableCollection<Student> studentItem; public ObservableCollection<Student> StudentItem { get { return studentItem; } set { studentItem = value; } } public void GetStudent() { AddStudent(); var students = from Student student in context.StudentItem select student; StudentItem = new ObservableCollection<Student>(students); } public void AddStudent() { //context = new ModelContext(strContext); Student s1 = new Student { Id = 1, Name = "张三" }; context.StudentItem.InsertOnSubmit(s1); Student s2 = new Student { Id = 2, Name = "李四" }; context.StudentItem.InsertOnSubmit(s2); Student s3 = new Student { Id = 3, Name = "王五" }; context.StudentItem.InsertOnSubmit(s3); context.SubmitChanges(); } public event PropertyChangedEventHandler PropertyChanged; private void NotifyPropertyChanged(string propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } }
现在我们需要生成数据库,并且调用以上的方法。我们首先要创建连接,通过DatabaseExists方法确认存储中没有此数据库,再用CreateDatabase方法创建数据库。之后再调用上面的方法添加数据并把数据绑定到WP页面中。现在我们在App.xaml.cs中的App()构造函数中实现:
private static Model viewModel; public static Model ViewModel { get { return App.viewModel; } } /// <summary> /// Application 对象的构造函数。 /// </summary> public App() { // 未捕获的异常的全局处理程序。 UnhandledException += Application_UnhandledException; // 标准 Silverlight 初始化 InitializeComponent(); // 特定于电话的初始化 InitializePhoneApplication(); // 调试时显示图形分析信息。 if (System.Diagnostics.Debugger.IsAttached) { // 显示当前帧速率计数器。 Application.Current.Host.Settings.EnableFrameRateCounter = true; // 显示在每个帧中重绘的应用程序区域。 //Application.Current.Host.Settings.EnableRedrawRegions = true; // 启用非生产分析可视化模式, // 该模式显示递交给 GPU 的包含彩色重叠区的页面区域。 //Application.Current.Host.Settings.EnableCacheVisualization = true; // 通过将应用程序的 PhoneApplicationService 对象的 UserIdleDetectionMode 属性 // 设置为 Disabled 来禁用应用程序空闲检测。 // 注意: 仅在调试模式下使用此设置。禁用用户空闲检测的应用程序在用户不使用电话时将继续运行 // 并且消耗电池电量。 PhoneApplicationService.Current.UserIdleDetectionMode = IdleDetectionMode.Disabled; } // 指定本地数据库连接字符串。 //Data Source=isostore:/ToDo.sdf string DBConnectionString = "Data Source=isostore:/ToDo.sdf"; // 创建数据库,如果它不存在。 using (ModelContext db = new ModelContext(DBConnectionString)) { if (db.DatabaseExists() == false) { // Create the local database. db.CreateDatabase(); } } // Create the ViewModel object. viewModel = new Model(DBConnectionString); viewModel.GetStudent(); }
在以上代码中我们创建了一个ViewModel对象用以给WP页面绑定数据:在MainPage.xaml中的代码如下:
<!--ContentPanel - 在此处放置其他内容--> <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0" DataContext="{Binding}"> <ListBox Name="listBoxBind" ItemsSource="{Binding Path=StudentItem}" Margin="12, 0, 12, 0" Width="440"> <ListBox.ItemTemplate> <DataTemplate> <StackPanel> <TextBlock Text="{Binding Id}"></TextBlock> <TextBlock Text="{Binding Name}"></TextBlock> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox> </Grid>
在MainPage.xaml.cs中的代码如下:
// 构造函数 public MainPage() { InitializeComponent(); this.DataContext = App.ViewModel; }
如果想要了解更多请参考:
http://msdn.microsoft.com/zh-cn/library/hh286405(v=vs.92).aspx
http://msdn.microsoft.com/zh-cn/library/hh202865(v=vs.92).aspx