介紹
與眾不同 windows phone 7.5 (sdk 7.1) 之本機資料庫
概述
示範如何使用“本機資料庫”
樣本
1、概述
Summary.xaml
<phone:PhoneApplicationPage x:Class="Demo.LocalDatabase.Summary" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone" xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" FontFamily="{StaticResource PhoneFontFamilyNormal}" FontSize="{StaticResource PhoneFontSizeNormal}" Foreground="{StaticResource PhoneForegroundBrush}" SupportedOrientations="Portrait" Orientation="Portrait" mc:Ignorable="d" d:DesignHeight="768" d:DesignWidth="480" shell:SystemTray.IsVisible="True"> <Grid x:Name="LayoutRoot" Background="Transparent"> <TextBlock TextWrapping="Wrap"> <Run>本機資料庫概述</Run> <LineBreak /> <LineBreak /> <Run>1、App 建立資料庫時,其檔案會被儲存到隔離儲存區 (Isolated Storage);程式包內資料庫只能被讀取,如果需要更新它,則必須把其複製到隔離儲存區 (Isolated Storage)後再操作</Run> <LineBreak /> <Run>2、資料庫結構發生改變時優先使用 DatabaseSchemaUpdater 來更新資料庫結構;資料移轉是下策</Run> <LineBreak /> <Run>3、唯讀情境下建議將 DataContext 的 ObjectTrackingEnabled 設定為 false(因為唯讀時不需要對象跟蹤),從而關閉對象跟蹤以減小記憶體使用量量</Run> <LineBreak /> <Run>4、在多線程操作本機資料庫的情境下,建議使用互斥鎖,即 System.Threading.Mutex</Run> </TextBlock> </Grid> </phone:PhoneApplicationPage>
2、使用“本機資料庫”的 Demo
Model層 - ModelBase.cs
using System; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Ink; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; using System.ComponentModel; using System.Data.Linq.Mapping; using System.Data.Linq; namespace Demo.LocalDatabase.Model { public class ModelBase : INotifyPropertyChanged, INotifyPropertyChanging { // 實現 INotifyPropertyChanged 是為了屬性變更後的通知 public event PropertyChangedEventHandler PropertyChanged; protected void NotifyPropertyChanged(string propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } // 實現 INotifyPropertyChanging 是為了最大限度地減少記憶體使用量量(NotifyPropertyChanging 的用法:在屬性賦值之前調用,具體可見 Category 或 Product) /* * 為什麼會減少記憶體使用量量呢? * 因為 LINQ to SQL 變更追蹤是通過維護每個對象的兩個副本進行工作的,第一個副本儲存未經處理資料,第二個副本有程式更改,這樣提交更新時 LINQ to SQL 就知道哪些資料被更改了,從而只提交這些被更改的資料 * INotifyPropertyChanging 介面允許應用程式在將修改後的資料提交到資料庫前通知 DataContext,DataContext 可以將該通知用作棄置站台的觸發器,這樣就不用保留第二個副本了,從而減少記憶體使用量 */ public event PropertyChangingEventHandler PropertyChanging; protected void NotifyPropertyChanging(string propertyName) { if (PropertyChanging != null) { PropertyChanging(this, new PropertyChangingEventArgs(propertyName)); } } } }