在App開發過程中,肯定需要有一些資料要存儲在本地,簡單的配置可以序列化後存成檔案,比如LocalSettings的方式,或儲存在獨立存儲中。但如果資料多的話,還是需要本地資料庫的支援。在UWP開發中,可以使用SQLite。本篇文章說一下如何在UWP中使用SQLite。因為SQLite是跨平台的,版本衆多,我剛開始用的時候不知道要裝哪個,什麼WP8的、WP8.1的、Win RT的……簡直摸不着頭腦。希望這篇文章能讓大家少走點彎路。
内容也很詳細,不過為了湊部落格數量,還是堅持寫完吧。順便也是給大家介紹MVVM-Sidekick的一些使用方法^_^
然後安裝。
還有一種方式是直接在VS2015裡的擴充和更新裡安裝,搜尋sqlite:
安裝擴充後,需要重新啟動VS2015。
還是建立一個MVVM-Sidekick項目,然後編譯一下,讓Nuget去自動添加所需引用。MVVM-Sidekick的使用詳見我之前的幾篇部落格。
現在可以添加SQLite引用了。在項目上點右鍵,添加引用:
還需要安裝一個sqlite-net-pcl,相當于一個ORM:
引用中有這兩個就可以了:
在項目中添加一個Models檔案夾,添加一個UserItem類:
public class UserItem
{
/// <summary>
/// 自增主鍵
/// </summary>
[AutoIncrement, PrimaryKey]
public int Id { get; set; }
/// 姓名
public string UserName { get; set; }
/// 年齡 不為空
[NotNull]
public int Age { get; set; }
/// 位址
public string Address { get; set; }
/// 忽略此值
[Ignore]
public string SomeProperty { get; set; }
}
先來簡單操作一下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:
StringBuilder sb = new StringBuilder();
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層的代碼就少很多了,實作了複用。
至于如何将資料取出來綁定到ListView上,應該就很簡單了。
對了還有那個單例的基類,也附在這裡: