Windows Phone 7, Mango güncellemesi ile pek çok yeni özellik kazandı. Bunlardan biri de cihaz üzerinde SQL Compact Edition kullanarak Isolated Storage tabanlı yerel bir veritabanı tutabilme imkanı. Yani, artık Windows Phone 7 programlarımızda veritabanı kullanabilmenin rahatlığına sahibiz.
Bu yazımda, birlikte Linq to SQL ile bir veritabanının nasıl kullanıldığını gösteren küçük bir uygulama yazacağız.
İlk önce yapmamız gereken şey, yeni bir Windows Phone Application projesi açmak. Ayrıca, bu programımız için Windows Phone SDK 7.1 sürümü gerekli. Ben bu örneğimizde projemizin adını “DatabaseApp” koydum.
Projemizi yarattıktan sonra, öncelikle formumuza ileride kullanacağımız componentları (bir listbox ve 2 button) ekleyelim. Listbox’ta veritabanından gelen bilgileri göstereceğiz, “Ekle” düğmesi veritabanımıza veri ekleyecek, ve “Göster” düğmesi de veritabanından bu verileri çekmekte kullanılacak.
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <ListBox Height="502" HorizontalAlignment="Left" Margin="6,0,0,0" Name="listBox1" VerticalAlignment="Top" Width="460" /> <Button Content="Ekle" Height="72" HorizontalAlignment="Left" Margin="0,508,0,0" Name="button1" VerticalAlignment="Top" Width="160" Click="button1_Click" /> <Button Content="Göster" Height="72" HorizontalAlignment="Left" Margin="296,508,0,0" Name="button2" VerticalAlignment="Top" Width="160" Click="button2_Click" /> </Grid>
Bundan sonra ise, Solution Explorer’da References kısmına System.Data.Linq kütüphanesini eklemeliyiz.
Veritabanımızı kullanabilmemiz için ihtiyacımız olan iki şey var. Birincisi, veritabanımıza bir Table tanımlamalıyız. İkincisi de, bir Linq DataContext tanımlamalıyız. Bunları düzenli yapmak için, projemizde iki adet klasör yaratıp, isimlerini “Data” ve “Model” koyuyoruz. Ardından da Table’ımızı tanımlamaya başlamak için “Model” klasörünün altına “DenemeData” isimli bir class ekliyoruz.
“DenemeData” classımız, aslında bizim için veritabanının içerisindeki bir Table. Bu class içerisine, uygulamamızda kullanacağımız veritabanının sütunlarını ekliyoruz. Örnek olduğu için sadece “Id” ve “Name” attributeleri ekledim, ancak burada istediğimiz kadar SQL Compact Edition’ın desteklediği tiplerde sütunlar ekleyebiliriz.
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 linq = System.Data.Linq; namespace DatabaseApp.Model { [linq.Mapping.Table(Name = "DenemeDatas")] public class DenemeData { private int Id_; [linq.Mapping.Column(IsPrimaryKey = true, CanBeNull = false, IsDbGenerated = true, DbType = "INT NOT NULL IDENTITY", AutoSync = linq.Mapping.AutoSync.OnInsert)] public int Id { get { return this.Id_; } set { this.Id_ = value; } } private string Name_; [linq.Mapping.Column(CanBeNull = false, DbType = "NVARCHAR(150)")] public string Name { get { return this.Name_; } set { this.Name_ = value; } } } }
Bu kod ile veritabanımız için bir Table yarattık. Şimdi ise programımızı bu veritabanına bağlamak için bir DataContext tanımlayacağız. “Data” klasörünün altına “DenemeDataContext” isimli bir class yaratıp, içini aşağıdaki kod ile dolduruyoruz.
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 linq = System.Data.Linq; namespace DatabaseApp.Data { public class DenemeDataContext:linq.DataContext { private static string connectionString_ = "Data Source=isostore:/DenemeDb.sdf"; public static string ConnectionString { get { return connectionString_; } } public DenemeDataContext(string connectionString) : base(connectionString) {//Kalıtım olarak aldığımız sınıftaki constructorı çağırdık. } public linq.Table<Model.DenemeData> DenemeDatas; } }
Şimdi de veritabanımızı uygulamamızın açılışında varolup olmadığına dair kontrol etmemiz, ve eğer yoksa yaratmamız gerekli. Bunu projemiz içerisindeki “App.xaml” dosyasının altındaki “App.xaml.cs” içerisinde yapacağız.
Kodumuzu aşağıdaki şekilde yerleştiriyoruz. Bu sayede uygulamamız açılırken veritabanımızın olup olmadığını kontrol edecek ve eğer yoksa yaratacak.
// Show graphics profiling information while debugging. if (System.Diagnostics.Debugger.IsAttached) { // Display the current frame rate counters. Application.Current.Host.Settings.EnableFrameRateCounter = true; // Show the areas of the app that are being redrawn in each frame. //Application.Current.Host.Settings.EnableRedrawRegions = true; // Enable non-production analysis visualization mode, // which shows areas of a page that are handed off to GPU with a colored overlay. //Application.Current.Host.Settings.EnableCacheVisualization = true; // Disable the application idle detection by setting the UserIdleDetectionMode property of the // application's PhoneApplicationService object to Disabled. // Caution:- Use this under debug mode only. Application that disables user idle detection will continue to run // and consume battery power when the user is not using the phone. PhoneApplicationService.Current.UserIdleDetectionMode = IdleDetectionMode.Disabled; using (Data.DenemeDataContext dataContext = new Data.DenemeDataContext(Data.DenemeDataContext.ConnectionString)) { if (!dataContext.DatabaseExists()) { dataContext.CreateDatabase(); } } }
Şu an neredeyse her şeyi yaptık. Geriye sadece uygulamamız içerisinden veritabanımıza ulaşmak kaldı. Öncelikle, en başta yaratmış olduğumuz Listbox’ımızın XAML kodunu aşağıdaki şekilde değiştiriyoruz.
<ListBox Height="502" HorizontalAlignment="Left" Margin="6,0,0,0" Name="listBox1" VerticalAlignment="Top" Width="460"> <ListBox.ItemTemplate> <DataTemplate> <StackPanel x:Name="DatabaseData" Orientation="Horizontal"> <TextBlock x:Name="IdTextBlock" Text="{Binding Id}"/> <TextBlock x:Name="NameTextBlock" Text="{Binding Name}"/> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox>
TextBlock’larımızın Text içeriklerini Binding yaparak veritabanından gelen bilgilerin orada gösterilmesini sağladık. Şimdi de uygulamamızın “MainPage.xaml.cs” dosyasını açıp, içerisine aşağıdaki bir kaç satırı ekliyoruz.
namespace DatabaseApp { public partial class MainPage : PhoneApplicationPage { Data.DenemeDataContext DataContext; // Constructor public MainPage() { InitializeComponent(); DataContext = new Data.DenemeDataContext(Data.DenemeDataContext.ConnectionString); } } }
Geriye sadece başta yarattığımız “Ekle” ve “Göster” düğmelerini ayarlamak kaldı.
private void button1_Click(object sender, RoutedEventArgs e) { for (int i = 0; i < 10; i++) { Model.DenemeData newDenemeData = new Model.DenemeData(); newDenemeData.Name = "Name " + i; DataContext.DenemeDatas.InsertOnSubmit(newDenemeData); } DataContext.SubmitChanges(); } private void button2_Click(object sender, RoutedEventArgs e) { var allDenemeDatas = from p in DataContext.DenemeDatas select p; listBox1.ItemsSource = allDenemeDatas.ToList(); }
Evet, uygulamamız düğmelerimizi de ayarlamamızla bitti. Eğer şimdi çalıştırırsanız karşınıza buna benzer bir görüntü çıkacaktır:
Windows Phone 7′de bu şekilde veritabanı kullanabiliyoruz. Pek çok uygulamada ve durumda çok işe yarayacağı kesin. Gelecekteki yazılarımda görüşmek üzere.
Uygulamanın kaynak koduna buradan ulaşabilirsiniz.