天天看點

Win10 UWP 開發系列:使用SQLite一、添加SQLite擴充二、添加SQLite引用三、添加實體類四、添加Command五、重構六、其他

在App開發過程中,肯定需要有一些資料要存儲在本地,簡單的配置可以序列化後存成檔案,比如LocalSettings的方式,或儲存在獨立存儲中。但如果資料多的話,還是需要本地資料庫的支援。在UWP開發中,可以使用SQLite。本篇文章說一下如何在UWP中使用SQLite。因為SQLite是跨平台的,版本衆多,我剛開始用的時候不知道要裝哪個,什麼WP8的、WP8.1的、Win RT的……簡直摸不着頭腦。希望這篇文章能讓大家少走點彎路。

内容也很詳細,不過為了湊部落格數量,還是堅持寫完吧。順便也是給大家介紹MVVM-Sidekick的一些使用方法^_^

Win10 UWP 開發系列:使用SQLite一、添加SQLite擴充二、添加SQLite引用三、添加實體類四、添加Command五、重構六、其他

然後安裝。

還有一種方式是直接在VS2015裡的擴充和更新裡安裝,搜尋sqlite:

Win10 UWP 開發系列:使用SQLite一、添加SQLite擴充二、添加SQLite引用三、添加實體類四、添加Command五、重構六、其他

安裝擴充後,需要重新啟動VS2015。

還是建立一個MVVM-Sidekick項目,然後編譯一下,讓Nuget去自動添加所需引用。MVVM-Sidekick的使用詳見我之前的幾篇部落格。

Win10 UWP 開發系列:使用SQLite一、添加SQLite擴充二、添加SQLite引用三、添加實體類四、添加Command五、重構六、其他

現在可以添加SQLite引用了。在項目上點右鍵,添加引用:

Win10 UWP 開發系列:使用SQLite一、添加SQLite擴充二、添加SQLite引用三、添加實體類四、添加Command五、重構六、其他

還需要安裝一個sqlite-net-pcl,相當于一個ORM:

Win10 UWP 開發系列:使用SQLite一、添加SQLite擴充二、添加SQLite引用三、添加實體類四、添加Command五、重構六、其他

引用中有這兩個就可以了:

Win10 UWP 開發系列:使用SQLite一、添加SQLite擴充二、添加SQLite引用三、添加實體類四、添加Command五、重構六、其他

在項目中添加一個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頁面添加兩個按鈕,一個是添加使用者,一個是讀取使用者:

Win10 UWP 開發系列:使用SQLite一、添加SQLite擴充二、添加SQLite引用三、添加實體類四、添加Command五、重構六、其他

在App.xaml.cs裡添加一個資料庫名:

Win10 UWP 開發系列:使用SQLite一、添加SQLite擴充二、添加SQLite引用三、添加實體類四、添加Command五、重構六、其他

然後在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綁定到頁面的按鈕上:

Win10 UWP 開發系列:使用SQLite一、添加SQLite擴充二、添加SQLite引用三、添加實體類四、添加Command五、重構六、其他

OK, 現在就可以運作一下看看了。

Win10 UWP 開發系列:使用SQLite一、添加SQLite擴充二、添加SQLite引用三、添加實體類四、添加Command五、重構六、其他

資料已經可以添加和讀取了。

當然以上代碼是非常ugly的,我們最好分一下層,把資料庫互動的部分拿出來。在VM中不要出現直接通路資料庫的代碼。

以前學程式設計的時候就經常念叨三層架構,何為三層架構?先上個圖:

Win10 UWP 開發系列:使用SQLite一、添加SQLite擴充二、添加SQLite引用三、添加實體類四、添加Command五、重構六、其他
Win10 UWP 開發系列:使用SQLite一、添加SQLite擴充二、添加SQLite引用三、添加實體類四、添加Command五、重構六、其他

底層羊肉塊,中層羊排,頂層海鮮,頂層的海鮮需要底層的熱氣來蒸,中層的羊排來把底層熱氣送上來……啊在深夜寫這篇文章簡直要流口水了……

有點跑題了。還是看我們的項目,剛才我們使用SQLite是直接在Command裡連接配接資料庫然後通路插入或讀取資料,這是非常醜陋的。最好把通路資料庫的代碼抽出來單獨放一層。

在項目裡建立一個Services檔案夾,添加一個DbContext.cs檔案。

這個類使用單例:

Win10 UWP 開發系列:使用SQLite一、添加SQLite擴充二、添加SQLite引用三、添加實體類四、添加Command五、重構六、其他

然後在app初始化的時候調用一下Init方法來初始化資料庫。在哪裡初始化呢,我們找到Startups目錄下的StartupFunctions.cs檔案,初始化代碼可以寫在RunAllConfig()方法裡:

Win10 UWP 開發系列:使用SQLite一、添加SQLite擴充二、添加SQLite引用三、添加實體類四、添加Command五、重構六、其他

然後在Services目錄裡添加一個DataService.cs檔案,在這裡就可以把常用的增删查改都實作一下了,如:

Win10 UWP 開發系列:使用SQLite一、添加SQLite擴充二、添加SQLite引用三、添加實體類四、添加Command五、重構六、其他

這個Service怎麼用呢,我習慣用MVVM-Sidekick提供的一個輕量級的ioc容器,還是在Startups目錄下的StartupFunctions.cs檔案的RunAllConfig()方法,添加這麼一行:

Win10 UWP 開發系列:使用SQLite一、添加SQLite擴充二、添加SQLite引用三、添加實體類四、添加Command五、重構六、其他

再回到MainPage_Model.cs檔案,修改vm裡的Command,

插入使用者就簡潔多了:

Win10 UWP 開發系列:使用SQLite一、添加SQLite擴充二、添加SQLite引用三、添加實體類四、添加Command五、重構六、其他

擷取所有使用者:

Win10 UWP 開發系列:使用SQLite一、添加SQLite擴充二、添加SQLite引用三、添加實體類四、添加Command五、重構六、其他

這樣在vm層的代碼就少很多了,實作了複用。

至于如何将資料取出來綁定到ListView上,應該就很簡單了。

對了還有那個單例的基類,也附在這裡:

Win10 UWP 開發系列:使用SQLite一、添加SQLite擴充二、添加SQLite引用三、添加實體類四、添加Command五、重構六、其他