db4o object database 引擎主要由一單獨的 DLL 組成。目前版本支援了 Microsoft .NET. framework 1.0/1.1 以及 2.0。
一般 .NET framework 的 DLL 檔位於安裝目錄內的 bin/net/ 目錄底下;.NET Compact Framework 則位於 bin/compact/ 下(我使用的 6.4 版本檔名為 Db4objects.Db4o.dll)。在開發時,必須將這個 DLL 加入到參考中。
Db4objects.Db4o namespace
包含了大部分開發所需要用到的功能。其中最重要的兩個類別是 Db4objects.Db4o.Db4oFactory 和 Db4objects.Db4o.IObjectContainer。
- Db4oFactory:提供的靜態方法讓我們可以開啟資料庫檔案、啟動伺服器或是連線到既存的伺服器。另外,它也允許我們再開啟資料庫前先設定好 db4o 的環境變數。
- IObjectContainer:則是我們最常會使用到,也是最重要的資料庫程式介面。它代表的就是我們的 db4o 資料庫。
- IObjectContainer 可能是處於單一使用者模式的某個資料庫,或是一個連線到某個 db4o 伺服器的客戶端連線。
- 每一個 IObjectContainer 都擁有一個 transaction。每個執行的動作都是處於 transaction 狀態;當我們開啟一個 IObjectContainer,我們就處於一個 transaction 之中;當我們下達 Commit() 或是 Rollback(),將會馬上切換到另一個 transaction。
- 只要我們有在操作 IObjectContainers,它將會持續保持開啟連接的狀態。當我們關閉一個 IObjectContainer,所有存在記憶體中的資料庫參考將會被丟棄。
第一個 db4o 程式
我們首先常是如何儲存、擷取、更新和刪除某個只包含 primitive 以及字串成員的類別 。
public class Sentence { private string rawText; /// raw 參數代表原本的文字內容 /// section 參數則為該文字所屬的 section public Sentence(string raw, string section) { rawText = raw; this.section = section; } public string RawText { get { return rawText; } set { rawText = value; length=value.Length} } private int length; public int Length { get { return length; } set { length = value; } } private string html; public string HTML { get { return html; } set { html = value; } } private string section; public string Section { get { return section; } set { section = value; } } }
開啟資料庫
要存取一個 db4o database 資料檔或是建立一個新的資料庫,我們只要呼叫 Db4oFactory.OpenFile(),並提供我們想要存取的資料庫檔案路徑當作參數及可。該方法會回傳一個 IObjectContainer 實例。
如前述,IObjectContainer 代表的就是一個資料庫,並且扮演了我們跟 db4o 將的主要溝通橋梁。藉由呼叫 Close() 方法,將關閉該 IObjectContainer 資料庫檔,並且是放所有參考到的資訊。
// accessDb4o IObjectContainer db = Db4oFactory.OpenFile(dbfilename); try { // do something with db4o } finally { db.Close(); }
儲存物件
要儲存某個物件,我們只要對我們的資料庫呼叫 Set() 方法,並且存給它某個物件當作參數及可!
// store First Sentence object Sentence s = new Sentence("Pain management: evaluating the effectiveness of an educational programme for surgical nursing staff.", "Title"); db.Set(s); Console.WriteLine("Stored {0}", s);
取回物件
db4o 提供三種不同的 query 系統:
- Query by Example (QBE)
- Native Queries (NQ)
- SODA Query API (SODA)
當使用 QBE 時,我們會提供 db4o 一個原型物件(prototypical object)作為我們想要取得的物件的一個範例,並呼叫 Get() 方法。db4o 將會依據傳給 Get() 方法的物件的內容,從資料庫內取得包含跟我們提供的物件一樣資料值欄位的所有物件(非預設值;一般物件的預設值為 null,int 為 0),並以 ObjectSet 實例回傳(代表所有符合的物件)。
下面我們示範如何從資料庫中取得所有的 Sentence 實例。方法很簡單,我們只要提供一個空的 Sentence 原型即可(所有的資料欄位值都為預設值):
Sentence sents = new Sentence(null, null); ObjectSet result = db.Get(sents); ListResult(result); // ...略 public static void ListResult(IObjectSet result) { Console.WriteLine(result.Size()); while (result.HasNext()) { Console.WriteLine(result.Next()); } }
db4o 另外提供了一個簡便的方法讓我們可以取得某類別的所有實例:
ObjectSet result = db.Get(typeof(Sentence)); ListResult(result);對於泛型物件,可以利用 query() 方法取得:
IList <Sentence> sents = db.query<Sentence>(typeof(Sentence));
下面示範如何依據 section 來查詢:
Sentence sent = new Sentence(null, "BACKGROUND"); ObjectSet result = db.Get(sent); ListResult(sent);
更新物件
更新物件跟儲存物件的動作很類似;我們也是呼叫同樣的 Set() 方法:
ObjectSet result = db.Get(new Sentence(null, "TITLE")); Sentence found = (Sentence)result.Next(); found.Section="BACKGROUND"; db.Set(found); Console.WriteLine("Modified section for" + found);
注意很重要的一點是我們第一個步驟是先去 query 物件。假若,當我們呼叫 Set() 方法去修改一個未知的(但是實際上我們想要修改的是既存的物件)的物件;也就是說我們沒有先去 queyr 物件,那麼 db4o 將會在資料庫內插入一個新的物件。db4o 並不會自動的把我們產生的物件跟資料庫內的物件進行比對;它假設我們實際上要插入一個剛剛好有同樣值的物件到資料庫內。
刪除物件
在資料庫內的物件可經由 DELETE() 方法加以移除。IObjectSet result = db.Get(new Sentence("Pain management: evaluating the effectiveness of an educational programme for surgical nursing staff.", null)); Sentence found = (Sentence)result.Next(); db.Delete(found); Console.WriteLine("Deleted {0}", found);
沒有留言:
張貼留言