以下將介紹在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沒移乾淨,請參考這篇
在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 說明
沒有留言:
張貼留言