在App開發過程中,肯定需要有一些數據要存儲在本地,簡單的配置可以序列化后存成文件,比如LocalSettings的方式,或保存在獨立存儲中。但如果數據多的話,還是需要本地數據庫的支持。在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上,應該就很簡單了。
對了還有那個單例的基類,也附在這里: