愚者の経験

「また今度」はほとんどこない

カテゴリーアーカイブ: Sterling

SilverlightのローカルDB「Sterling」を使ってみる

前の投稿でも紹介しました「Sterling」を使ってみます。
C#の少し勉強(と言っても本買ってしたわけでなく実験的にコーディングしただけ)したので
当時わからなかったことでも今は若干理解出来ます。「ラムダ式」はかなり苦手ですが。

参考URL:http://www.slideshare.net/odashinsuke/silverlightwp7-db

やはり「こう書けばできる」より理解できている方が色々応用できます。

まず保存するデータクラス(「エンティティ」というらしい)を定義します。
Accessでいうところのテーブルデザインです。

using System;

namespace Sterling
{
    public class Person
    {
        public Guid ID { get; set; }
        public int Number { get; set; }
        public string Name { get; set; }
    }
}

publicのみ保存対象です。いつもの「Person」クラスです。
「Sterling」はクラスを直接保存するようなデータベースで「RDB」ではなく「OODB」です。

次にデータベースクラスを定義します。
データベースクラスはBaseDatabaseInstance』を継承し「RegisterTables」メソッドをoverrideして
メソッド内で『ITableDefinition』の『List』を返します。

『ITableDefinition』 は「CreateTableDefinition」メソッドで作成します。
「CreateTableDefinition」メソッドの引数に指定したデータクラスを保存できるようになります。

using System;
using System.Collections.Generic;
using Wintellect.Sterling.Database;

namespace Sterling
{
    public class Database : BaseDatabaseInstance
    {
        //インデックス名
        public const string IX_Person_ID = “IX_Person_ID”;
        public const string IX_Person_Number_Name = “IX_Person_Number_Name”;

        protected override List RegisterTables()
        {
            return new List()
            {
                //データクラスを指定(ラムダ式で主キーのプロパティ指定)
                CreateTableDefinition(e=>e.Number)
                    //インデックスを指定
                    .WithIndex
                        //インデックス名,ラムダ式でインデックスの値を返す
                        (IX_Person_ID,e=>e.ID)
                    //インデックスを指定(2個目)
                    .WithIndex
                        //インデックス名,ラムダ式でインデックスの値を返す
                        (IX_Person_Number_Name,e=>new Tuple(e.Number,e.Name))
            };
        }
    }
}

ラムダ式は「パッと書け」と言われると無理です。

インデックスが不要であれば.WithIndex以下の文は要りません。
あとインデックスと言っても「重複なし」だとか指定できるわけはないです。
あくまでメモリ上に持つ値の指定です。※まだ使いたてなのでおそらくですが…

現段階ではGuidはKeyに指定するとエラーになりました。参考URLではKeyに指定できると
書いてあるのでやり方が間違っているかもしれません。

CreateTableDefinition(e=>e.ID)←これで実行時にエラー

また一つのインデックスで指定できる列は2つまでです。データの問い合わせではインデックスは
一つずつしか使用できないので(おそらく)実際に使うとなると考えて作る必要があります。

ここでまた勉強です。『Tuple』クラスは値をひとつにまとめたクラスになります。
最高で8つ指定可能で、Tuple.Item1みたいな形で要素にアクセスします。

実際にこれを使ってみます。
データの追加とDatagridに表示をやっています。
「MainPage.xaml」のコードビハインド

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using Wintellect.Sterling;
using Wintellect.Sterling.Database;
using Wintellect.Sterling.IsolatedStorage;

namespace Sterling
{
    public partial class MainPage : UserControl
    {
        private SterlingEngine _engine;
        private ISterlingDatabaseInstance _db;

        public MainPage()
        {
            InitializeComponent();
            _engine = new SterlingEngine();
            _engine.Activate();
            _db = _engine.SterlingDatabase.RegisterDatabase(new IsolatedStorageDriver());
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            //Linqで問い合わせ(インデックスを使用する場合は(インデックス名)
            var grid =from p in _db.Query(Database.IX_Person_Number_Name)

                        //where p.Index.Item1 == 1
                        //インスタンス(実際の値)はLazyValue.Valueにある

                        select p.LazyValue.Value;
            dataGrid1.ItemsSource = grid;
        }

        private void button2_Click(object sender, RoutedEventArgs e)
        {
            //インスタンス追加
            _db.Save(new Person() { ID = Guid.NewGuid(), Number = int.Parse(textBox1.Text), Name = (string)textBox2.Text });
            //保存
            _db.Flush();
        }
    }
}

「MainPage.xaml」

<UserControl x:Class="Sterling.MainPage"
    xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation&#8221;
    xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml&#8221;
    xmlns:d=”http://schemas.microsoft.com/expression/blend/2008&#8243;
    xmlns:mc=”http://schemas.openxmlformats.org/markup-compatibility/2006&#8243;
    xmlns:my=”clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data”          
    mc:Ignorable=”d”
    d:DesignHeight=”600″ d:DesignWidth=”800″>
   
       
       
       
       
       
   

Queryメソッドでインデックスを指定するために「インデックスは一つしか使えない」と判断しました。
最高でもKeyとあわせて3列しか指定できないのかもしれません。Tuple入れ子とかできる?

また保存についてはFlashメソッドを呼んでやる必要があります。

これからもいろいろ調べていきます。
もしSterling知っている人がいたらいろいろ教えて欲しいですm(__)m