在win10 UWP開發中,我們可以使用SQLite。本篇文章說一下如何在UWP中使用SQLite。因為SQLite是跨平台的,版本眾多,我剛開始用的時候不知道要裝哪個,什麼WP8的、WP8.1的、Win RT的……簡直摸不著頭腦。希望這篇文章能讓大家少走點彎路。
一、添加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上,應該就很簡單了。
對了還有那個單例的基類,也附在這裡:
補充一篇 win UWP開發中使用SQLite資料庫
環境配置
1.下載和安裝SQLite
要使用sqlite,首先是要從sqlite.org下載SQLite啦,附上下載頁的連結http://sqlite.org/download.html,然後選擇UAP的版本:
下載下來的是一個VSIX的安裝包,安裝後重啟VS,選擇Tools -> Extensions and Updates… -> Installed -> SDKs中,會看到SQLite for Universal App Platform,說明SQLite已經安裝完成!!
2.在工程中添加對SQLite的引用
現在,在我們的VS中,已經有了SQLite的整合,在相應工程目錄下添加對SQLite的引用即可,右鍵點擊References ?> Add Reference,選擇對SQLite的添加。
3.添加.Net支援
如果要使用C#的開發,還需要對工程本身進行進一步的配置,這就需要NuGet的協助了。
右鍵點擊工程名,選擇Manage NuGet Packages…,然後搜尋SQLitePCL,Install即可。
安裝完成後,在Project的References裡,便會多出一個SQLitePCL的引用。
圖中紅色方塊裡圈出的部分,其中上面的是對SQLite的引用,下面的是對SQLitePCL的引用。
在此完成之後,就可以使用SQLite開發了!!當然,在相應的檔案中,不要忘了添加using SQLitePCL哦!!
定義SQL語句常量
在實際開發中,通常是把SQL語句統一起來進行管理,有的開發人員在使用db過程中也喜歡使用一些Contract來使編碼更加規範,為了更加清晰明了,這裡只提供一些最基本的SQL語句供大家參考。
private static String DB_NAME = "SQLiteSample.db";
private static String TABLE_NAME = "SampleTable";
private static String SQL_CREATE_TABLE = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + " (Key TEXT,Value TEXT);";
private static String SQL_QUERY_VALUE = "SELECT Value FROM " + TABLE_NAME + " WHERE Key = (?);";
private static String SQL_INSERT = "INSERT INTO " + TABLE_NAME + " VALUES(?,?);";
private static String SQL_UPDATE = "UPDATE " + TABLE_NAME + " SET Value = ? WHERE Key = ?";
private static String SQL_DELETE = "DELETE FROM " + TABLE_NAME + " WHERE Key = ?"
建立第一張表
當你定義好一些SQL命令之後,就可以對資料庫進行一系列的操作,最基本的當然是create table啦,以下給出執行個體代碼:
_connection = new SQLiteConnection(DB_NAME);
using (var statement = _connection.Prepare(SQL_CREATE_TABLE))
{
statement.Step();
}
由於執行SQL語句的代碼大致一樣,所以不過多贅述,給出範例代碼,其中key和value都是String變數。
INSERT
using (var statement = _connection.Prepare(SQL_INSERT))
{
statement.Bind(1, key);
statement.Bind(2, value);
statement.Step();
}
DELETE
using (var statement = _connection.Prepare(SQL_DELETE))
{
statement.Bind(1, key);
statement.Step();
}
UPDATE
using(var statement = _connection.Prepare(SQL_UPDATE))
{
statement.Bind(1, value);
statement.Bind(2, key);
statement.Step();
}
QUERY
using (var statement = _connection.Prepare(SQL_QUERY_VALUE))
{
statement.Bind(1, key);
SQLiteResult result = statement.Step();
if (SQLiteResult.ROW == result)
{
value = statement[0] as String;
}
}
值得說明的是,在statement執行Step()的過程中,會返回一個SQLiteResult的傳回值,在遍曆返回結果的過程中,判斷 result是不是SQLiteResult.ROW就可以,關於SQLiteResult的具體內容,請參考SQLite.org的文檔說明。
其它
說了半天使用SQLite開發,那麼我們建立出來的資料庫究竟在存放在哪裡呢?系統預設是放在這個路徑的:C:\Users\(username) \AppData\Local\Packages\(packagename)\LocalState,其中username當然就不用小編解釋了,當然就是您的使用者名稱嘍!packagename可以在工程目錄裡面的Package.appxmanifest檔案裡查看,如圖:
在這個路徑下,我們能找到以我們的DB_NAME命名的檔案,如SQLiteSample.db。
那麼,我們怎麼才能查看這種資料庫呢,這裡有許多第三方工具可以使用,小編比較推薦SQLite Expert,介面簡單友好,使用方便,並且有personal的版本,完全免費哦。
結語
在uwp開發中,使用SQLite是一件很簡單的事情,配合windows強大的儲存功能和簡潔的開發介面,讓我們一起來開發美妙的uwp application吧!