2014年4月8日

使用Sqlite開發Windows phone 8 CRUD程式

Sqlite是個可攜式的資料庫,不需要Process只要附著在你的APP就可執行,非常適合用在APP的Local DB。
以下將介紹在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
並安裝
image
安裝完會自動加入參考Sqlite
image

加入Sqlite參考

  • 加入Sqlite參考 
image
  • 加入參考後,會發現Sqlite參考為驚嘆號,這是因為預設方案的平台是Any CPU,Sqlite不支援這模式,必須改成x86 或 ARM,x86是模擬器用,實體Windows phone 8 為ARM架構,則要選ARM,但只能用實體機測,這邊要進行測試先選x86 
image
  • 方案--右鍵--屬性,組態Debug,改平台為x86 
image

加入sqlite-net套件


這是一個使用Linq語法以ORM操作Sqlite的wrapper

套件管理主控台,輸入以下指令

Install-package sqlite-net 

image

會加入一個參考,兩CS操作檔


image

並在應用程式專案--建置--一般--條件式編譯的符號,加入以下文字,以指示Sqlite.cs裡的Define命令使用該段程式碼。

USE_WP8_NATIVE_SQLITE 

image

開始使用Sqlite


1. 拖曳
兩個Textblock,Textbox,四個按鈕,一個Listbox
image
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
image

參數4:本地端路徑
詳情參考 Isolation storage操 作以上指令會抓第一個虛擬機,如果要指定虛擬機,把參數2:xd換成deviceindex:n


ISETool.exe ts deviceindex:3 d43b51ed-8c41-4806-a062-862cd64bce33 "g:\data"
deviceindex可以用以下查詢

ISETool.exe EnumerateDevices

image


如果有以下錯誤可能是先前的windows phone SDK沒移乾淨,請參考這篇

  image 

取回的檔加入專案

image 

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
image 

瀏覽Sqlite

可以下載這軟體Sqlite Database Browser,來瀏覽資料庫。

原始碼下載

原始碼

參考

Windows Phone 8 - 操作SQLite的練習
使用Sqlite入門
praeclarum  / sqlite-net 說明

沒有留言:

張貼留言