以下メモ書きです。
db4o(http://www.db4o.com/default.aspx)が、なんか面白そうなのでちょっと触ってみました。
確かにちょこっと使う分には簡単ですね。組み込みのデータベースにはもってこいです。
以下はselect,insert,update,deleteをやってみたサンプルです。
サンプルを作成する前に、一応Util系クラスも作成してみました。
db4oでは、データベースを開く際に以下のように通常します。
IObjectContainer db = Db4oFactory.OpenFile(Util.YapFileName); try { // do something with db4o } finally { db.Close(); }
でも、usingを使いたいので以下のようなヘボいラッパーを作成しました。
// vim:set ts=4 sw=4 et ws is nowrap ft=cs: using System; using Db4objects.Db4o; namespace Gsf.Samples.Tmp{ public class DisposableObjectContainerWrapper : IDisposable{ IObjectContainer _container; public DisposableObjectContainerWrapper(IObjectContainer container){ _container = container; } public IObjectContainer Container{ get{ return _container; } } public void Dispose(){ _container.Close(); } } }
これで、以下のように実行できます。
using(DisposableObjectContainerWrapper wrapper = new DisposableObjectContainerWrapper(Db4oFactory.OpenFile(DB_FILE_NAME))){ }
んで、以下が今回使用するモデルオブジェクトです。
// vim:set ts=4 sw=4 et ws is nowrap ft=cs: using System; namespace Gsf.Samples.Tmp.Models{ public class Person{ string _id; string _name; public Person() : this(null, null){ // nop; } public Person(string id, string name){ _id = id; _name = name; } public string Id{ get{ return _id; } set{ _id = value; } } public string Name{ get{ return _name; } set{ _name = value; } } public override string ToString(){ return string.Format("Id:{0}, Name:{1}", Id, Name); } } }
んで、実際のサンプルです。
// vim:set ts=4 sw=4 et ws is nowrap ft=cs: using System; using Db4objects.Db4o; using Gsf.Samples.Tmp.Models; namespace Gsf.Samples.Tmp{ public class SimpleCRUDSample : IExecutor{ const string DB_FILE_NAME = "mydb.db"; public void Execute(){ // // データベースオープン. // using(DisposableObjectContainerWrapper wrapper = new DisposableObjectContainerWrapper(Db4oFactory.OpenFile(DB_FILE_NAME))){ IObjectContainer db = wrapper.Container; // // select and delete. // foreach(object o in db.Get(typeof(Person))){ db.Delete(o); } db.Commit(); // // select. // Console.WriteLine("============ DELETE後 ================"); Console.WriteLine(db.Get(typeof(Person)).Size()); // // insert. // db.Set(new Person("1", "gsf_zero1")); db.Commit(); // // select. // Console.WriteLine("============ INSERT後 ================"); Console.WriteLine(db.Get(typeof(Person)).Size()); Console.WriteLine(db.Get(new Person("1", null)).Next()); // // update. // Person aPerson = db.Get(new Person("1", null)).Next() as Person; aPerson.Name = "gsf_zero2"; db.Set(aPerson); db.Commit(); // // select. // Console.WriteLine("============ UPDATE後 ================"); Console.WriteLine(db.Get(typeof(Person)).Size()); Console.WriteLine(db.Get(new Person("1", null)).Next()); } } } }