標籤:
在App開發過程中,肯定需要有一些資料要儲存在本地,簡單的配置可以序列化後存成檔案,比如LocalSettings的方式,或儲存在隔離儲存區 (Isolated Storage)中。但如果資料多的話,還是需要本機資料庫的支援。在UWP開發中,可以使用SQLite。本篇文章說一下如何在UWP中使用SQLite。因為SQLite是跨平台的,版本眾多,我剛開始用的時候不知道要裝哪個,什麼WP8的、WP8.1的、Win RT的……簡直摸不著頭腦。希望這篇文章能讓大家少走點彎路。
其實這篇文章寫到一半就看到已經有大神寫了這個:http://www.cnblogs.com/ms-uap/p/4798269.html
還有這個 http://www.cnblogs.com/h82258652/p/4802076.html
內容也很詳細,不過為了湊部落格數量,還是堅持寫完吧。順便也是給大家介紹MVVM-Sidekick的一些使用方法^_^
一、添加SQLite擴充
首先要添加SQLite的庫。首頁是http://sqlite.org/,在:http://sqlite.org/download.html。這個頁面有所有平台的,下載這個:
然後安裝。
還有一種方式是直接在VS2015裡的擴充和更新裡安裝,搜尋sqlite:
安裝擴充後,需要重新啟動VS2015。
二、添加SQLite引用
還是建立一個MVVM-Sidekick項目,然後編譯一下,讓Nuget去自動添加所需引用。MVVM-Sidekick的使用詳見我之前的幾篇部落格。
現在可以添加SQLite引用了。在項目上點右鍵,添加引用:
還需要安裝一個sqlite-net-pcl,相當於一個ORM:
引用中有這兩個就可以了:
三、添加實體類
在項目中添加一個Models檔案夾,添加一個UserItem類:
public class UserItem { /// <summary> /// 自增主鍵 /// </summary> [AutoIncrement, PrimaryKey] public int Id { get; set; } /// <summary> /// 姓名 /// </summary> public string UserName { get; set; } /// <summary> /// 年齡 不為空白 /// </summary> [NotNull] public int Age { get; set; } /// <summary> /// 地址 /// </summary> public string Address { get; set; } /// <summary> /// 忽略此值 /// </summary> [Ignore] public string SomeProperty { get; set; } } |
四、添加Command
先來簡單操作一下SQLite感受一下。在MainPage頁面添加兩個按鈕,一個是添加使用者,一個是讀取使用者:
在App.xaml.cs裡添加一個資料庫名:
然後在MainPage_Model.cs檔案裡添加兩個Command,可以用程式碼片段propcmd來產生一段Command代碼:
添加使用者命名為CommandAddUser,
await MVVMSidekick.Utilities.TaskExHelper.Yield(); string path = Path.Combine(Windows.Storage.ApplicationData.Current.LocalFolder.Path, App.DbFileName); using (var db = new SQLiteConnection(new SQLitePlatformWinRT(), path)) { db.CreateTable<UserItem>(); UserItem item = new UserItem { Address = "北京", Age = 20, SomeProperty = "哈哈", UserName = "王小明" }; db.Insert(item); } |
擷取使用者列表命名為CommandGetUsers:
await MVVMSidekick.Utilities.TaskExHelper.Yield(); string path = Path.Combine(Windows.Storage.ApplicationData.Current.LocalFolder.Path, App.DbFileName); StringBuilder sb = new StringBuilder(); using (var db = new SQLiteConnection(new SQLitePlatformWinRT(), path)) { var list = db.Table<UserItem>(); foreach (var item in list) { sb.AppendLine($"{item.Id} {item.UserName} {item.Age} {item.Address}"); } await new MessageDialog(sb.ToString()).ShowAsync(); } |
然後把這兩個Command綁定到頁面的按鈕上:
OK, 現在就可以運行一下看看了。
資料已經可以添加和讀取了。
當然以上代碼是非常ugly的,我們最好分一下層,把資料庫互動的部分拿出來。在VM中不要出現直接存取資料庫的代碼。
五、重構
以前學編程的時候就經常念叨三層架構,何為三層架構?先上個圖:
底層羊肉塊,中層羊排,頂層海鮮,頂層的海鮮需要底層的熱氣來蒸,中層的羊排來把底層熱氣送上來……啊在深夜寫這篇文章簡直要流口水了……
有點跑題了。還是看我們的項目,剛才我們使用SQLite是直接在Command裡串連資料庫然後訪問插入或讀取資料,這是非常醜陋的。最好把訪問資料庫的代碼抽出來單獨放一層。
在項目裡建立一個Services檔案夾,添加一個DbContext.cs檔案。
這個類使用單例:
然後在app初始化的時候調用一下Init方法來初始化資料庫。在哪裡初始化呢,我們找到Startups目錄下的StartupFunctions.cs檔案,初始化代碼可以寫在RunAllConfig()方法裡:
然後在Services目錄裡添加一個DataService.cs檔案,在這裡就可以把常用的增刪查改都實現一下了,如:
這個Service怎麼用呢,我習慣用MVVM-Sidekick提供的一個輕量級的ioc容器,還是在Startups目錄下的StartupFunctions.cs檔案的RunAllConfig()方法,添加這麼一行:
再回到MainPage_Model.cs檔案,修改vm裡的Command,
插入使用者就簡潔多了:
擷取所有使用者:
這樣在vm層的代碼就少很多了,實現了複用。
六、其他
本來還想寫寫如何讀取資料庫,不過在h大神http://www.cnblogs.com/h82258652/p/4802076.html 這個文章裡已經詳細敘述了如何去找到這個資料庫及如何讀取資料庫,這裡就不再贅述了。此外他還提到了項目必須編譯為x86或x64,不能為Any CPU,也要注意下。
至於如何將資料取出來綁定到ListView上,應該就很簡單了。
對了還有那個單例的基類,也附在這裡:
Win10 UWP 開發系列:使用SQLite