WP8的本地数据库是面向对象型的数据库,所以他的表就是一个实现了System.ComponentModel.INotifyPropertyChanged和System.ComponentModelINotifyPropertyChanging接口,并标识System.Data.Linq.Mapping. TableAttribute特性的类
下面是一个班级表
1 /// <summary> 2 /// 班级表 3 /// </summary> 4 [System.Data.Linq.Mapping.Table] 5 public class Class:INotifyPropertyChanged, INotifyPropertyChanging 6 { 7 public event PropertyChangingEventHandler PropertyChanging; 8 9 public event PropertyChangedEventHandler PropertyChanged; 10 }
然后给班级表增加“编号”、“学年”、“班主任”,“序号”这几个字段
字段是通过定义标识System.Data.Linq.Mapping. ColumnAttribute的属性作为表的字段,并且要调用PropertyChanging,和PropertyChanged事件
对于Column特性,我要会经常设置的内容:
DbType:获取或设置数据库列的类型。
IsPrimaryKey:获取或设置一个值,该值指示该类成员是否表示作为表的整个主键或部分主键的列。
CanBeNull:获取或设置一个值,该值指示列是否可包含 null 值。
IsDbGenerated:获取或设置一个值,该值指示列是否包含数据库自动生成的值。
比如我要设置一个不自增、不为空的char(5)类型主键:
private string _ID; /// <summary> /// 属性的注释 /// </summary> [Column(AutoSync=AutoSync.OnInsert, IsDbGenerated=false, CanBeNull=false, DbType="char(5)")] public string ID { get { return this._ID; } set { if (this._ID != value) { NotifyPropertyChanging(); this._ID = value; NotifyPropertyChanged(); } } }
更多DbType的相关信息请访问:http://msdn.microsoft.com/zh-cn/library/system.data.linq.mapping.columnattribute.dbtype(v=vs.110).aspx
有关Column的其他内容,请访问http://msdn.microsoft.com/zh-cn/library/system.data.linq.mapping.columnattribute_properties(v=vs.110).aspx
一个完整的班级表
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data.Linq.Mapping;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
namespace WP8DBStudy.DB
{
/// <summary>
/// 班级表
/// </summary>
[System.Data.Linq.Mapping.Table]
public class Class:INotifyPropertyChanged, INotifyPropertyChanging
{
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
public event PropertyChangingEventHandler PropertyChanging;
private void NotifyPropertyChanging([CallerMemberName] String propertyName = "")
{
if (PropertyChanging != null)
{
PropertyChanging(this, new PropertyChangingEventArgs(propertyName));
}
}
private int _OrderBy;
/// <summary>
/// 序号
/// </summary>
[Column(IsDbGenerated=true)]
public int OrderBy
{
get { return this._OrderBy; }
set
{
if (this._OrderBy != value)
{
NotifyPropertyChanging();
_OrderBy = value;
NotifyPropertyChanged();
}
}
}
private string _ID;
/// <summary>
/// 属性的注释
/// </summary>
[Column(AutoSync=AutoSync.OnInsert, IsDbGenerated=false, CanBeNull=false, DbType="NCHAR(5)")]
public string ID
{
get { return this._ID; }
set
{
if (this._ID != value)
{
NotifyPropertyChanging();
this._ID = value;
NotifyPropertyChanged();
}
}
}
private string _Grade;
/// <summary>
/// 学年
/// </summary>
[Column]
public string Grade
{
get { return this._Grade; }
set
{
if (this._Grade != value)
{
NotifyPropertyChanging();
this._Grade = value;
NotifyPropertyChanged();
}
}
}
private string _HeadTeacher;
/// <summary>
/// 班主任
/// </summary>
[Column]
public string HeadTeacher
{
get { return this._HeadTeacher; }
set
{
if (this._HeadTeacher != value)
{
NotifyPropertyChanging();
this._HeadTeacher = value;
NotifyPropertyChanged();
}
}
}
}
}
创建了表类,我们还没能直接使用,在WP8中是通过DataContext类的子类来作为一个代理类操作数据库的
public class DBContext : DataContext { public const string CONNET_STR = "Data Source=‘isostore:/db.sdf‘;Password=‘111111‘"; public DBContext() : base(CONNET_STR) { } public Table<ClassTable> ClassTable; }
类型为Table<T> 的公开字段就是表对象,字段名和类型名一样(不一样需要另外配置,暂不说)
数据库的链接字符串格式是:
Data Source=‘isostore:/<文件名>‘;Password=‘<密码>‘
在App.xaml.cs文件的构造函数中使用如下代码创建数据库
using (DB.DBContext db = new DB.DBContext()) { //不存在数据库的时候才创建新数据库,注意,如果修改了数据库的话,需要删除重新创建数据库 if (db.DatabaseExists() == false) { db.CreateDatabase(); } }
下班了,今天就写创建数据库好了,接下来还有操作数据库,要注意的事项和高级应用(比如表间关系的设置),最终会完成一个辅助管理班级的app。