Windows Phone 7本地數(shù)據(jù)庫的多樣化訪問
最近個人的時間顯得比較緊迫. 有一些想法一直沒有時間去驗證.上周五在MSDN上公布的活動Silverlight Events:與John Papa面對面學(xué)習(xí)Silverlight 4中因為一時疏忽趕到MSDN會客廳是活動已經(jīng)結(jié)束了. 不過我順便看看活動中對JohnPapa提出問題: 其中有人明確提出Silverlight 下一版本會把本地數(shù)據(jù)庫訪問支持是否會在下一個Silverlight版本加入?[可惜我沒有看到John Papa本人的回復(fù)]. 這突然讓我聯(lián)想到最近一直在看官方公布開源項目中Windows Phone 7對本地數(shù)據(jù)數(shù)據(jù)庫操作方式. 恰好上周我做了一個SQlite相關(guān)測試. 有意無意間讓我把Windows Phone 7 對本地數(shù)據(jù)庫Local DataBase訪問與開源數(shù)據(jù)庫聯(lián)系在一起.如下是我個人對WP7本地數(shù)據(jù)庫訪問方式的驗證. 如有疑問請及時提出
Windows Phone 7在CTP 版本時微軟官方就對開發(fā)者提出問題做了兩次集體回應(yīng). 一次是在3月19日 另外一次是5月19日.回復(fù)內(nèi)容詳見Windows Phone 7 Series Developer General FAQ (Updated 5/19/2010), 內(nèi)容中包含了WP7開發(fā)中多個細節(jié)和下一步需要改善的方向等做了明確回復(fù). 當(dāng)然其中也包含了大家很關(guān)心的數(shù)據(jù)訪問. 具體回應(yīng)內(nèi)容如下:
在Windows Phone 7 Series的設(shè)備上有沒有本地數(shù)據(jù)庫可以利用?
沒有,在最初的Windows Phone 7 Series上沒有本地數(shù)據(jù)庫API可以利用
我應(yīng)該如何為我的應(yīng)用程序存儲信息?
你可以將信息存儲在自己的存儲空間里。如果你需要大型的數(shù)據(jù)庫這里有一些選擇:Windows Phone 7 Seires 已經(jīng)支持WebServices,它可以讓你容易的訪問存儲在Internet上的信息。使用一個可以被WebServices訪問的數(shù)據(jù)庫,你的應(yīng)用程序就可以在連接Internet的情況下實時的獲取數(shù)據(jù).
以后會支持本地數(shù)據(jù)庫嗎?
當(dāng)前我們沒有宣告這樣的計劃來增加這一功能;但是我們會密切關(guān)注開發(fā)人員和用戶的需求并識別哪些特性會給每個人帶來好處
如上翻譯過來,更多細節(jié)請查看原文.
目前WP7已經(jīng)是Beta版本了. Windows Phone 7 支持訪問數(shù)據(jù)幾種方式為: XML、Isolated Storage[SL獨立存儲]、Cloud[云存儲]. 官方意思很明確 暫不支持本地數(shù)據(jù)庫訪問. 難道我們真的沒有其他選擇嗎?未必如此.
<1>Effiproz For Windows Phone 7
在上一篇中由Effiproz DataBase來看.NET開源數(shù)據(jù)庫發(fā)展我提到Effiproz開源數(shù)據(jù)庫.NET多方面支持,其中就包含WP7.這為我們把Effiproz本地數(shù)據(jù)庫提供訪問WP7數(shù)據(jù)提供了可能.首先說明Effiproz運用在WP7條件: Windows Phone Developer Tools Beta[最新版本]/VS2010[工具].
首先創(chuàng)建一個WP7程序 引入Effiproz數(shù)據(jù)庫DLL[詳見源碼下載]到項目中:
創(chuàng)建一個界面用戶輸入用戶名和密碼并 保存到Effiproz數(shù)據(jù)庫中:
數(shù)據(jù)插入成功后自動查詢并實現(xiàn)出來:
也許有人會注意到兩個FileDB和MemoryDB 按鈕. 其實對應(yīng)后臺中Effproze數(shù)據(jù)兩種存儲數(shù)據(jù)模式:文件和內(nèi)存模式. 上篇中我就曾講到第一個純.NET版本開源數(shù)據(jù)庫出現(xiàn)問題矛盾就是這兩種模式. 內(nèi)存模式中數(shù)據(jù)提取直接 速度較快. 免去File模式讀取硬盤IO和每次創(chuàng)建Connection的時間. 但是缺點也很致命. 速度雖然有了一定提升 但最終代價是我們數(shù)據(jù)無法再內(nèi)存消失后存儲. 也就是數(shù)據(jù)最終無法持久化存儲文件中. EffProze就是從HSQL繼承而來. 所以保存這兩種模式 供用戶更多場景下選擇. 先看一下FileDB模式代碼實際創(chuàng)建:建:
- private void AddUserInfor_Click(object sender, RoutedEventArgs e)
- {
- //用戶信息
- WP7_LocalDBDemo.DataEntity.Customer newcustomer = new DataEntity.Customer
- {
- Username=this.username.Text,
- Password=this.passsword.Text
- };
- string dbname = @"wp7db.db3";
- string getreply = string.Empty;//回調(diào)信息
- //如果數(shù)據(jù)庫文件不存在 自動創(chuàng)建
- Sqlite3.sqlite3 newsqlite = new Sqlite3.sqlite3();
- int getres = Sqlite3.sqlite3_open(dbname,ref newsqlite);
- if (getres == Sqlite3.SQLITE_OK)
- {
- //創(chuàng)建表
- string sql = @"Create Table Customer
- (
- customername varchar(100),
- customerpass varchar(100)
- ) ";
- Sqlite3.exec(newsqlite, sql, 0, 0, 0);
- string insertsql = @"insert into Customer Values('"+newcustomer.Username+"','"+newcustomer.Password+"')";
- int getinsertres = Sqlite3.exec(newsqlite, insertsql, 0, 0, 0);
- if (getinsertres == Sqlite3.SQLITE_OK)
- {
- MessageBox.Show("數(shù)據(jù)插入成功!");
- }
- else
- {
- MessageBox.Show("數(shù)據(jù)插入失??!");
- }
- //自動查詢數(shù)據(jù)
- string querysql = @"select * from Customer";
- Sqlite3.dxCallback getcallback = new Sqlite3.dxCallback(TakeCallmethod);
- int getlocalres=Sqlite3.sqlite3_exec(newsqlite,querysql,getcallback,null,ref getreply);
- if (getlocalres == Sqlite3.SQLITE_OPEN_READWRITE)
- {
- //需要一個執(zhí)行Reader API?
- //this.listBox1.Items.Add(getresdd.ToString());
- }
- }
- }
EffProze數(shù)據(jù)庫基本上引入T-SQL大部分關(guān)鍵字支持,基本上合ADO.NET連接數(shù)據(jù)庫方式雷同. 這也讓.NET程序員不用再看EffProze新的API痛苦,而通過ADO.NET方式對比即可輕松編碼.在代碼中連接字符串中connection type=FILE/Memory 每次連接都需要指定采用數(shù)據(jù)庫模式. 這是必須的. Memory模式大同小異不在贅述.
當(dāng)有了EffProze數(shù)據(jù)庫在WP7中作一些復(fù)雜數(shù)據(jù)操作. 是否考慮我們我們這樣在代碼方式太過粗糙原始. 我們需要一個查詢工具.
當(dāng)然EffPoze官方也為我們考慮到這點. 特意推出一款QueryTool. 當(dāng)然有多個版本的,你想快速體驗可以訪問QueryTool in Silverlight 4 liveDemo 把QueryTool利用Silverlight 版本 4來實現(xiàn). 另外一個版本需要到官方下載 QueryTool 1.2 Version[點擊下載]: 提示目前工具支持.NET版本是3.5以上 本地運行:
如上提示我們需要打開數(shù)據(jù)庫文件,Effproze數(shù)據(jù)庫文件格式為: [.properties] 編寫的SQL腳本對應(yīng)格式為:[.Script]和SQl那一套完全不同. 下載文件中有實例數(shù)據(jù)庫SamplyDB. 打開:
很簡單布局,類似SQLSErver. 對T-SQl標(biāo)準(zhǔn)中關(guān)鍵字全面進行高亮支持. 這比SQlite工具要友好. 但我個人使用總體覺得很難受. 用戶體驗不太好. 其中涉及幾個方面:
A:對T-Sql標(biāo)準(zhǔn)的有些關(guān)鍵字語法檢查太過于嚴密. 大小寫敏感. 寫T-Sql出錯幾率大大增加.
B:工具功能過于簡單. 左邊菜單中除了展出和隱藏沒有任何對DataBase和表 以及View /Proc的直接操作 只能用T-sql, 這樣一來 我們隊數(shù)據(jù)庫操作全部靠T-sql 工作量劇增.
C:最令我不舒服的是 每次出現(xiàn)錯誤提示太過于簡單. 特別大批量T-SQl 無法準(zhǔn)確定位錯誤大概位置 那就更讓人望而生畏了.
D:沒有批量數(shù)據(jù)導(dǎo)入導(dǎo)出. 對于數(shù)據(jù)插入 沒有這樣的功能 工作量 真是太令人后怕了.
所以這個對使用這個工具原則是: 能避免使用就盡量避免使用. 基本上我昨天調(diào)試一個對數(shù)據(jù)庫所有存儲過程加密 調(diào)到最后看到下面始終不變錯誤提示我先崩潰掉了.真是很杯具啊. 各位也可以適當(dāng)使用.
如上是EffProze數(shù)據(jù)庫對WP7數(shù)據(jù)訪問支持一個簡單示例以及基本工具使用. 如有疑問請在留言中提出.我會及時回復(fù) ,提供EffProze use In WP7本篇源碼下載:
/Files/chenkai/EffProzeInWp7Codechenkai.rar
<2>SQlite For Windows Phone 7
在本地數(shù)據(jù)庫訪問其實我最先嘗試SQlite,作為移動平臺Android默認數(shù)據(jù)庫大量運用,沒有其他原因—只是因為我個人對Sqlite操作很熟. 雖然沒有了WP7官方的支持. 但是開源社區(qū)力量無線的. 國外有人改寫開源Sqlite 3版本使其支持WP7本地數(shù)據(jù)訪問. 我們需要添加一個DLL: Community.CsharpSqlite.WP.dll [源碼中]引用.
創(chuàng)建一個簡單頁面測試 添加數(shù)據(jù)后自動查詢數(shù)據(jù)并顯示ListBox中:
插入數(shù)據(jù)成功 把插入數(shù)據(jù)通過自動查詢方式顯示在ListBox中 添加數(shù)據(jù)代碼:
- private void AddUserInfor_Click(object sender, RoutedEventArgs e)
- {
- //用戶信息
- WP7_LocalDBDemo.DataEntity.Customer newcustomer = new DataEntity.Customer
- {
- Username=this.username.Text,
- Password=this.passsword.Text
- };
- string dbname = @"wp7db.db3";
- string getreply = string.Empty;//回調(diào)信息
- //如果數(shù)據(jù)庫文件不存在 自動創(chuàng)建
- Sqlite3.sqlite3 newsqlite = new Sqlite3.sqlite3();
- int getres = Sqlite3.sqlite3_open(dbname,ref newsqlite);
- if (getres == Sqlite3.SQLITE_OK)
- {
- //創(chuàng)建表
- string sql = @"Create Table Customer
- (
- customername varchar(100),
- customerpass varchar(100)
- ) ";
- Sqlite3.exec(newsqlite, sql, 0, 0, 0);
- string insertsql = @"insert into Customer Values('"+newcustomer.Username+"','"+newcustomer.Password+"')";
- int getinsertres = Sqlite3.exec(newsqlite, insertsql, 0, 0, 0);
- if (getinsertres == Sqlite3.SQLITE_OK)
- {
- MessageBox.Show("數(shù)據(jù)插入成功!");
- }
- else
- {
- MessageBox.Show("數(shù)據(jù)插入失?。?quot;);
- }
- //自動查詢數(shù)據(jù)
- string querysql = @"select * from Customer";
- Sqlite3.dxCallback getcallback = new Sqlite3.dxCallback(TakeCallmethod);
- int getlocalres=Sqlite3.sqlite3_exec(newsqlite,querysql,getcallback,null,ref getreply);
- if (getlocalres == Sqlite3.SQLITE_OPEN_READWRITE)
- {
- //需要一個執(zhí)行Reader API?
- //this.listBox1.Items.Add(getresdd.ToString());
- }
- }
- }
SQlite 3修改后能夠支持對WP7數(shù)據(jù)訪問 .大概方式基本同EffProze有些雷同. 但是在實際編碼中.Effproze封裝API的基本同ADO.NET相似. 這樣廣大的.NET程序員無需再熟悉EffProze數(shù)據(jù)庫自己API, 而修改SQlite 3支持WP7 不同的是. 這里SQlite 3完全創(chuàng)造自己的一套API. 和原來支持.NET 訪問的ADO.NET For SQlite 3 DataProvders完全不同. 沒有任何關(guān)聯(lián).
那就痛苦了.所以我們需要一個SQlite 3訪問WP7 的詳細API. 但是很遺憾.如果訪問到這份API 需要翻墻.具體地址:Sqlite 3 For Windows Phoen Created API訪問地址: Sqlite 3 For Wp7 API 如有哪位同志翻墻成功 請備份這份API貢獻出來吧.
SQlite 3支持了WP7的本地數(shù)據(jù)訪問. 但是SQlite 3與EffProze最大特點是Sqlite 3沒有數(shù)據(jù)庫鏈接模式之分[內(nèi)存/文件模式], 我在做完這個實例后 測試發(fā)現(xiàn). 硬盤上不存在wp7db.db3這個文件. 因此我懷疑修改后SQlite 3版本對數(shù)據(jù)存儲模式應(yīng)該放到內(nèi)存中的. 當(dāng)然這是我個人猜測. 沒有得到作者本人的證實.
如上寫了一個建的Sqlite For Wp7 DEmo. 源碼下載如下:
/Files/chenkai/WP7_LocalDBDemo.rar
<3>結(jié)語
本篇主要驗證EffProze和修改Sqlite 數(shù)據(jù)庫對Windows Phone 7 本地數(shù)據(jù)訪問支持. 測試結(jié)果是可行的.這是第一篇 下一篇我會詳細介紹其他方式來做WP7本地數(shù)據(jù)訪問. 當(dāng)然如上也是我個人測試. 難免會有紕漏的地方. 如果喲疑問請及時留言. 我會及時回復(fù).
參考資料:
Sqlite 3 For Windows Phoen Created
Sqlite 3 For Wp7 API
LocalDAtaBase For Windows Phone 7
DotaSys Windows Phone 7 Demo
原文標(biāo)題:多樣化實現(xiàn)Windows Phone 7本地數(shù)據(jù)庫訪問<1>
鏈接:http://www.cnblogs.com/chenkai/archive/2010/09/01/1815186.html
【編輯推薦】