多樣化實現Windows Phone 7本地數據庫訪問<上>

作者: chenkai  來源: 博客園  發布時間: 2010-09-06 16:08  閱讀: 2214 次  推薦: 1   原文鏈接   [收藏]  

  最近個人的時間顯得比較緊迫,有一些想法一直沒有時間去驗證,上周五在MSDN上公布的活動Silverlight Events:與John Papa面對面學習Silverlight 4中因為一時疏忽趕到MSDN會客廳是活動已經結束了。 不過我順便看看活動中對JohnPapa提出問題: 其中有人明確提出Silverlight 下一版本會把本地數據庫訪問支持是否會在下一個Silverlight版本加入?[可惜我沒有看到John Papa本人的回復],這突然讓我聯想到最近一直在看官方公布開源項目中Windows Phone 7對本地數據數據庫操作方式, 恰好上周我做了一個SQlite相關測試。 有意無意間讓我把Windows Phone 7 對本地數據庫Local DataBase訪問與開源數據庫聯系在一起。如下是我個人對WP7本地數據庫訪問方式的驗證,如有疑問請及時提出。

  Windows Phone 7在CTP 版本時微軟官方就對開發者提出問題做了兩次集體回應. 一次是在3月19日 另外一次是5月19日.回復內容詳見Windows Phone 7 Series Developer General FAQ (Updated 5/19/2010), 內容中包含了WP7開發中多個細節和下一步需要改善的方向等做了明確回復. 當然其中也包含了大家很關心的數據訪問. 具體回應內容如下:

在Windows Phone 7 Series的設備上有沒有本地數據庫可以利用?
沒有,在最初的Windows Phone 7 Series上沒有本地數據庫API可以利用
我應該如何為我的應用程序存儲信息?
你可以將信息存儲在自己的存儲空間里。如果你需要大型的數據庫這里有一些選擇:Windows Phone 7 Seires 已經支持WebServices,它可以讓你容易的訪問存儲在Internet上的信息。使用一個可以被WebServices訪問的數據庫,你的應用程序就可以在連接Internet的情況下實時的獲取數據.

以后會支持本地數據庫嗎?
當前我們沒有宣告這樣的計劃來增加這一功能;但是我們會密切關注開發人員和用戶的需求并識別哪些特性會給每個人帶來好處

  如上翻譯過來,更多細節請查看原文.

  目前WP7已經是Beta版本了. Windows Phone 7 支持訪問數據幾種方式為: XML、Isolated Storage[SL獨立存儲]、Cloud[云存儲].    官方意思很明確 暫不支持本地數據庫訪問. 難道我們真的沒有其他選擇嗎?未必如此.

  <1>Effiproz For Windows Phone 7

  在上一篇中由Effiproz DataBase來看.NET開源數據庫發展我提到Effiproz開源數據庫.NET多方面支持,其中就包含WP7.這為我們把Effiproz本地數據庫提供訪問WP7數據提供了可能.首先說明Effiproz運用在WP7條件:  Windows Phone Developer Tools Beta[最新版本]/VS2010[工具].

  首先創建一個WP7程序 引入Effiproz數據庫DLL[詳見源碼下載]到項目中:

  創建一個界面用戶輸入用戶名和密碼并 保存到Effiproz數據庫中:

  插入成功后自動查詢并實現出來:

  也許有人會注意到兩個FileDB和MemoryDB 按鈕. 其實對應后臺中Effproze數據兩種存儲數據模式:文件和內存模式. 上篇中我就曾講到第一個純.NET版本開源數據庫出現問題矛盾就是這兩種模式. 內存模式中數據提取直接 速度較快. 免去File模式讀取硬盤IO和每次創建Connection的時間. 但是缺點也很致命. 速度雖然有了一定提升 但最終代價是我們數據無法再內存消失后存儲. 也就是數據最終無法持久化存儲文件中.  EffProze就是從HSQL繼承而來. 所以保存這兩種模式 供用戶更多場景下選擇. 先看一下FileDB模式代碼實際創建:

 
private void btnFile_Click(object sender, RoutedEventArgs e)
{

//isolated storage database
string connectionString = "connection type=FILE; initial catalog=TestDb; user=SA; password=";
using (EfzConnection conn = new EfzConnection(connectionString))
{
conn.Open();

string sql = "CREATE TABLE Test(username varchar(100), password varchar(100));";
EfzCommand cmd
= conn.CreateCommand();
cmd.CommandText
= sql;
cmd.ExecuteNonQuery();

//獲取輸入數據
string getusername = this.nametxt.Text;
string getpass = this.passtxt.Text;
sql
= "INSERT INTO Test(username , password ) VALUES('" + getusername + "','"+getpass+"');";
cmd.CommandText
= sql;
int count=cmd.ExecuteNonQuery();
if (count == 1)
{
MessageBox.Show(
"數據插入成功!");
}

else
{
MessageBox.Show(
"數據插入失敗!");
}

//執行查詢操作
sql = "SELECT * FROM TEST;";
cmd.CommandText
= sql;
EfzDataReader reader
= cmd.ExecuteReader();
reader.Read();

//添加結果顯示
//MessageBox.Show(string.Format("用戶名={0} —— 登錄密碼={1}", reader.GetInt32(0), reader.GetString(1)));
tbkText.Text = String.Format("用戶名 = {0}, 登錄密碼 = {1}, 模式=文件模式 ", reader.GetString(0), reader.GetString(1));
}
}

  EffProze數據庫基本上引入T-SQL大部分關鍵字支持,基本上合ADO.NET連接數據庫方式雷同. 這也讓.NET程序員不用再看EffProze新的API痛苦,而通過ADO.NET方式對比即可輕松編碼.在代碼中連接字符串中connection type=FILE/Memory 每次連接都需要指定采用數據庫模式. 這是必須的. Memory模式大同小異不在贅述。

  當有了EffProze數據庫在WP7中作一些復雜數據操作. 是否考慮我們我們這樣在代碼方式太過粗糙原始. 我們需要一個查詢工具。

  當然EffPoze官方也為我們考慮到這點. 特意推出一款QueryTool. 當然有多個版本的,你想快速體驗可以訪問QueryTool in Silverlight 4 liveDemo 把QueryTool利用Silverlight 版本 4來實現. 另外一個版本需要到官方下載 QueryTool 1.2 Version[點擊下載]:  提示目前工具支持.NET版本是3.5以上 本地運行:

  如上提示我們需要打開數據庫文件,Effproze數據庫文件格式為: [.properties]  編寫的SQL腳本對應格式為:[.Script]和SQl那一套完全不同.  下載文件中有實例數據庫SamplyDB. 打開:

  很簡單布局,類似SQLSErver. 對T-SQl標準中關鍵字全面進行高亮支持. 這比SQlite工具要友好. 但我個人使用總體覺得很難受.  用戶體驗不太好. 其中涉及幾個方面:

  A:對T-Sql標準的有些關鍵字語法檢查太過于嚴密. 大小寫敏感. 寫T-Sql出錯幾率大大增加.

  B:工具功能過于簡單. 左邊菜單中除了展出和隱藏沒有任何對DataBase和表 以及View /Proc的直接操作 只能用T-sql, 這樣一來 我們隊數據庫操作全部靠T-sql 工作量劇增.

  C:最令我不舒服的是 每次出現錯誤提示太過于簡單. 特別大批量T-SQl 無法準確定位錯誤大概位置 那就更讓人望而生畏了.

  D:沒有批量數據導入導出. 對于數據插入 沒有這樣的功能 工作量 真是太令人后怕了.

  所以這個對使用這個工具原則是: 能避免使用就盡量避免使用. 基本上我昨天調試一個對數據庫所有存儲過程加密 調到最后看到下面始終不變錯誤提示我先崩潰掉了.真是很杯具啊. 各位也可以適當使用.

  如上是EffProze數據庫對WP7數據訪問支持一個簡單示例以及基本工具使用. 如有疑問請在留言中提出.我會及時回復 ,提供EffProze use In WP7本篇源碼下載:

   /Files/chenkai/EffProzeInWp7Codechenkai.rar

  <2>SQlite For Windows  Phone 7

  在本地數據庫訪問其實我最先嘗試SQlite,作為移動平臺Android默認數據庫大量運用,沒有其他原因—只是因為我個人對Sqlite操作很熟. 雖然沒有了WP7官方的支持. 但是開源社區力量無線的. 國外有人改寫開源Sqlite 3版本使其支持WP7本地數據訪問. 我們需要添加一個DLL: Community.CsharpSqlite.WP.dll [源碼中]引用.

  創建一個簡單頁面測試 添加數據后自動查詢數據并顯示ListBox中,插入數據成功 把插入數據通過自動查詢方式顯示在ListBox中 添加數據代碼:

 
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;//回調信息

//如果數據庫文件不存在 自動創建
Sqlite3.sqlite3 newsqlite = new Sqlite3.sqlite3();
int getres = Sqlite3.sqlite3_open(dbname,ref newsqlite);
if (getres == Sqlite3.SQLITE_OK)
{

//創建表
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(
"數據插入成功!");
}

else
{
MessageBox.Show(
"數據插入失敗!");
}


//自動查詢數據
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)
{

//需要一個執行Reader API?
//this.listBox1.Items.Add(getresdd.ToString());
}
}
}

  SQlite 3修改后能夠支持對WP7數據訪問 .大概方式基本同EffProze有些雷同.  但是在實際編碼中.Effproze封裝API的基本同ADO.NET相似. 這樣廣大的.NET程序員無需再熟悉EffProze數據庫自己API, 而修改SQlite 3支持WP7 不同的是. 這里SQlite 3完全創造自己的一套API. 和原來支持.NET 訪問的ADO.NET For SQlite 3  DataProvders完全不同. 沒有任何關聯.

  那就痛苦了.所以我們需要一個SQlite 3訪問WP7 的詳細API.  但是很遺憾.如果訪問到這份API 需要翻墻.具體地址:Sqlite 3 For Windows Phoen Created API訪問地址:  Sqlite 3 For Wp7 API 如有哪位同志翻墻成功 請備份這份API貢獻出來吧.

  SQlite 3支持了WP7的本地數據訪問. 但是SQlite 3與EffProze最大特點是Sqlite 3沒有數據庫鏈接模式之分[內存/文件模式], 我在做完這個實例后 測試發現. 硬盤上不存在wp7db.db3這個文件. 因此我懷疑修改后SQlite 3版本對數據存儲模式應該放到內存中的. 當然這是我個人猜測. 沒有得到作者本人的證實.

  如上寫了一個建的Sqlite For Wp7 DEmo. 源碼下載如下:

  /Files/chenkai/WP7_LocalDBDemo.rar

  <3>結語

  本篇主要驗證EffProze和修改Sqlite 數據庫對Windows Phone 7 本地數據訪問支持.  測試結果是可行的.這是第一篇 下一篇我會詳細介紹其他方式來做WP7本地數據訪問.  當然如上也是我個人測試. 難免會有紕漏的地方. 如果喲疑問請及時留言. 我會及時回復.

  參考資料:

  Sqlite 3 For Windows Phoen Created

  Sqlite 3 For Wp7 API

  LocalDAtaBase  For Windows  Phone 7

  DotaSys Windows  Phone 7  Demo

1
0
 
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()