以下將介紹在Visual studio 2013 使用Sqlite開發Windows phone 8的CRUD,俗稱的增刪改查APP。以下說明整個開發過程。
安裝Sqlite for Windows phone 8
首先到Sqlite for Windows phone 下載套件,執行visix檔案安裝。 安裝Sqlite-net-wp8
首先,新增一個Windows phone專案接著,在Nuget管理介面搜尋 sqlite-net-wp8
並安裝
安裝完會自動加入參考Sqlite
加入Sqlite參考
- 加入Sqlite參考
- 加入參考後,會發現Sqlite參考為驚嘆號,這是因為預設方案的平台是Any CPU,Sqlite不支援這模式,必須改成x86 或 ARM,x86是模擬器用,實體Windows phone 8 為ARM架構,則要選ARM,但只能用實體機測,這邊要進行測試先選x86
- 方案--右鍵--屬性,組態Debug,改平台為x86
加入sqlite-net套件
這是一個使用Linq語法以ORM操作Sqlite的wrapper
套件管理主控台,輸入以下指令
Install-package sqlite-net會加入一個參考,兩CS操作檔
並在應用程式專案--建置--一般--條件式編譯的符號,加入以下文字,以指示Sqlite.cs裡的Define命令使用該段程式碼。
USE_WP8_NATIVE_SQLITE
開始使用Sqlite
1. 拖曳
兩個Textblock,Textbox,四個按鈕,一個Listbox
2. 設定資料庫連線
/// <summary> /// 資料庫路徑. /// </summary> public static string DB_PATH = Path.Combine(Path.Combine(ApplicationData.Current.LocalFolder.Path, "sample.sqlite")); protected override void OnNavigatedTo(NavigationEventArgs e) { /// 建 資料庫 connection. dbConn = new SQLiteConnection(DB_PATH); /// 建 table Category, 如果不存在的話 dbConn.CreateTable<Category>(); ShowListData(); } protected override void OnNavigatedFrom(NavigationEventArgs e) { if (dbConn != null) { /// Close 資料庫 connection. dbConn.Close(); } private void ShowListData() { /// 從DB讀取 Category list List<Category> retrievedTasks = dbConn.Table<Category>().ToList<Category>(); /// 清除list資料,顯示所有資料 TaskListBox.Items.Clear(); foreach (var t in retrievedTasks) { TaskListBox.Items.Add(t); } }
3. 查詢
private void Filter_Click(object sender, RoutedEventArgs e) { var query = dbConn.Table<Category>().Where(v => v.CatID.Equals(CatID.Text)); foreach (Category c in query) { Description.Text = c.Description; } }
4. 新增
private void Insert_Click(object sender, RoutedEventArgs e) { //建Category物件 Category cat = new Category() { CatID = CatID.Text, Description = Description.Text, CreationDate = DateTime.Now }; /// Insert Category到 table. dbConn.Insert(cat); ShowListData(); }
5. 刪除
private void Delete_Click(object sender, RoutedEventArgs e) { Category cat = this.TaskListBox.SelectedItem as Category; dbConn.Delete(cat); ShowListData(); MessageBox.Show("刪除資料成功"); }
6. 修改
private void Save_Click(object sender, RoutedEventArgs e) { Category cat = this.TaskListBox.SelectedItem as Category; cat.CatID = CatID.Text; cat.Description = Description.Text; dbConn.Update(cat); ShowListData(); MessageBox.Show("更新資料成功"); }
7. List查詢
private void TaskListBox_Tap(object sender, System.Windows.Input.GestureEventArgs e) { Category cat = this.TaskListBox.SelectedItem as Category; CatID.Text = cat.CatID; Description.Text = cat.Description; }
複製Sqlite 檔案到專案裡
如果你的程式上架到Store裡,使用者下載下來的APP,在執行接端是無法產生資料庫,但允許程式啟動時唯讀安裝目錄裡的Sqlite檔,寫入到Local storage。 因此,必須執行以下指令把Sqlite檔案從模擬機取回。切換目錄到以下
cd C:\Program Files (x86)\Microsoft SDKs\Windows Phone\v8.1\Tools\IsolatedStorageExplorerTool
執行IsolatedStorageExplorerTool取回檔案,以下是指令:
模擬機 command
ISETool.exe ts xd d43b51ed-8c41-4806-a062-862cd64bce33 "g:\data"實體機 command
ISETool.exe ts de d43b51ed-8c41-4806-a062-862cd64bce33 "g:\data"
參數1: ts 從裝置複製IsolatedStor裡的檔案到你的電腦上參數2: xd 模擬機 , de 實體機 , deviceindex:n
參數3: properties\WMAppManifest.xml 的產品 ID
參數4:本地端路徑
詳情參考 Isolation storage操 作以上指令會抓第一個虛擬機,如果要指定虛擬機,把參數2:xd換成deviceindex:n
ISETool.exe ts deviceindex:3 d43b51ed-8c41-4806-a062-862cd64bce33 "g:\data"
deviceindex可以用以下查詢
ISETool.exe EnumerateDevices
如果有以下錯誤可能是先前的windows phone SDK沒移乾淨,請參考這篇
取回的檔加入專案
sqlite的建置動作要設為"內容"
在App.xml.cs 裡啟動加入複製檔案程式碼,Application_Lunching要改為async
並using以下using Windows.Storage;
using System.IO.IsolatedStorage;
using System.IO;
private async void Application_Launching(object sender, LaunchingEventArgs e) { StorageFile dbFile = null; try { // 是否存在DB檔 dbFile = await StorageFile.GetFileFromPathAsync(MainPage.DB_PATH); } catch (FileNotFoundException) { if (dbFile == null) { // 從安裝目錄複製到Local storage // 取得APP虛擬 store IsolatedStorageFile iso = IsolatedStorageFile.GetUserStoreForApplication(); //從安裝目錄建立sqlite檔案stream using (Stream input = Application.GetResourceStream(new Uri("sample.sqlite", UriKind.Relative)).Stream) { // 使用stream在local建立檔案 using (IsolatedStorageFileStream output = iso.CreateFile(MainPage.DB_PATH)) { // 清 buffer. byte[] readBuffer = new byte[4096]; int bytesRead = -1; // 從安裝目錄複製檔案到local while ((bytesRead = input.Read(readBuffer, 0, readBuffer.Length)) > 0) { output.Write(readBuffer, 0, bytesRead); } } } } } }
使用實體機測
如果我們選Device進行測試,會出現以下錯誤錯誤 1 所建置之專案的處理器架構 "ARM" 與 "G:\XXXX\WindowsPhone8\Apps\PayPayTool\packages\sqlite-net-wp8.3.8.4.200\build\windowsphone8\x86\Sqlite.winmd" 之實作檔 "G:\XXXX\WindowsPhone8\Apps\PayPayTool\packages\sqlite-net-wp8.3.8.4.200\build\windowsphone8\x86\Sqlite.dll" 的處理器架構 "x86" 不相符。這種不相符狀況可能造成執行階段失敗。請考慮透過組態管理員變更專案的目標處理器架構,使專案和實作檔之間的處理器架構相符,或選擇內含的實作檔具有符合專案目標處理器架構的 winmd 檔案。解決的方式如下 :
1. 刪除原本的sqlit參考
2. 改參考以下:
..\packages\sqlite-net-wp8.3.8.4.200\build\windowsphone8\ARM\Sqlite.winmd
3. 方案平台改為 ARM
瀏覽Sqlite
可以下載這軟體Sqlite Database Browser,來瀏覽資料庫。原始碼下載
原始碼參考
Windows Phone 8 - 操作SQLite的練習使用Sqlite入門
praeclarum / sqlite-net 說明
沒有留言:
張貼留言