Xamarin.Android之SQLite.NET ORM


一、前言

通過《Xamarin.Android之SQLiteOpenHelper》《Xamarin.Android之ContentProvider》的學習,我們已經掌握了如何使用特定於該平台的數據庫操作。但是這樣卻和Xamarin所宣稱的跨平台相違背了,因為這樣我們就需要針對不同的平台編寫不同的代碼,而本章將使用Github上的開源項目SQLite.NET去解決這個問題,從而可以實現跨平台,減少代碼的重復。

關於該開源項目請點我

 

二、准備工作

因為這個庫很大,而我們只需要其中的一個.cs文件就可以了,所以筆者這里已經封裝好了一個庫,里面不僅包含了這個庫,還包含了可以跨平台的網絡連接。

點我下載

因為該庫還使用了一個json庫,所以讀者也一並要下載並引用

點我下載

 

然后新建一個Android Application項目(.net 4.0)並且SDK版本設置為14(Android 4.0),下面我們就可以開始正式學習了。

 

三、正文

 

1.引用命名空間

打開MainActivity類並在頂部加上如下引用

1 using NSCPAndroid.SQLite;

 

 

2.創建一個映射類

有過一定開發經驗的人一定會很熟悉ORM,筆者平時用的最多的就是EFCastle Active Record。當然還有很多其他更優秀的框架。不熟悉的人也沒有關系,下面我們只是新建一個類,而這個類的結構完全是對應到數據庫中的表的。比如筆者在這里創建一個名為Stock的表:

1 [Table("Stock")]
2 public class StockTable
3 {
4      [PrimaryKey, AutoIncrement, Column("_id")]
5      public int Id { get; set; }
6 
7      [MaxLength(8)]
8      public string Symbol { get; set; }
9 }

其中我們可以看到Table這個注解屬性,含義就是這個類對應到數據庫中的表名。讀者不要誤認為是依照類名,下面就是兩個字段其中關鍵的就是主鍵,因為SQLite規定主鍵必須由自身維護,所以這里我們使用了PrimaryKey注解屬性表示該屬性為主鍵,AutoIncrement表示該主鍵為自增,最后就是Column表示該字段對應到該表的字段名(名字必須為_id),下面一個就是我們自己的字段了,筆者使用了MaxLength表示該字段最大可以保存八個字符。

關於更多的注解屬性可以看下面的介紹。

[PrimaryKey]:表示該表的主鍵,只能用於Int類型的屬性。

[AutoIncrement]:用於需要自增的屬性,每插入一條新數據該字段都會自增,只能用於Int類型。

[Column(name)]:用來表示指定屬性對應到表中字段的名稱,如果不加該屬性則表中的字段名與屬性名相同。

[Table(name)]:用來表示指定類對應到數據庫中的表名稱,如果不加該屬性則數據庫中的表名稱與該類名稱相同。

[MaxLength(value)]:用來限制字段能夠保存的最長字符長度。

[Ignore]:表示忽略該屬性,從而不會在表中生成對應的字段。

[Unique]:表示該屬性的值必須在表中唯一。

 

3.創建數據庫連接

我們需要指定數據庫所保存的路徑,同時還要打開該數據庫。如果不存在該數據庫,則會自動創建該文件。下面的代碼我們將獲取數據庫的路徑並打開該數據庫:

1 string dbPath = Path.Combine(System.Environment.
2 GetFolderPath(System.Environment.SpecialFolder.Personal),"ormdemo.db3");
3 var db = new SQLiteConnection(dbPath);

 

這里要注意我們用的是SQLiteConnection打開該數據庫的,而不是SqlConnection。成功打開該數據庫之后剩下的工作我們只需要利用db就可以輕松完成了,到現在為止我們僅僅創建了一個空的數據庫,里面還不存在任何表。

 

4.創建表

第2步我們已經創建好了一個表的結構,下面我們將在數據庫中創建對應的表,我們只需要通過下面的代碼就可以輕松的創建一個表了:

1 db.CreateTable<StockTable>();

或者下面這個方式也一樣可以:

1 db.CreateTable(typeof(StockTable));

創建完之后表還是空的,所以接下來我們需要插入幾條數據,這樣才能介紹其他的操作。

 

注:實際運用中一定會有人想找如何判斷該表是否已經創建的方法,其實沒有必須要找,即使重復的執行該操作,也不會影響什么,表一旦創建之后在執行就不會重新創建了。

 

5.插入數據

這里我們直接通過創建StockTable的實例來插入到數據庫中,比如下面的代碼我們將會插入一條數據:

1 var newStock = new StockTable();
2 newStock.Symbol = "First";
3 db.Insert(newStock);

是不是十分簡單,僅僅只需要調用Insert即可,該方法還會返回插入數據的主鍵。但是這只是插入一條數據,如果我們需要插入多條數據呢?當然不可能用foreach,已經提供了另一個方法InsertAll,比如下面的示例將會同時插入多條數據:

 1 List<StockTable> stocks = new List<StockTable>
 2 {
 3     new StockTable{
 4             Symbol = "First"
 5     },
 6     new StockTable{
 7             Symbol = "Second"
 8     }
 9 };
10 db.InsertAll(stocks);

如果讀者需要驗證下是不是插入了,我們可以獲取該表有多少數據即可,比如下面的代碼:

1 int count = db.Table<StockTable>().Count();

這時表里已經有數據了,下面我們就需要進行查詢。

 

6.查詢數據

首先介紹最簡單的查詢方式,就是依靠id來直接獲取。當然我們不需要拼接任何SQL,只需要通過下面這段代碼就可以獲取id為1的數據了:

1 var item = db.Get<StockTable>(1);

 

 

但是大多數情況下我們都需要通過條件語句進行查詢,那樣我們就需要使用SQL語句了,比如下面的查詢語句,我們將查詢Symbol開頭為“F”的數據:

1 var items = db.Query<StockTable>(" select * from Stock where Symbol like ? ", "F%");

 

 

相信那些對技術比較追求的人一定知道Linq,它讓我們擺脫的拼接SQL語句的尷尬,使得查詢變的簡單有趣(復雜的查詢還是需要采用SQL,甚至是存儲過程等),當然在這里我們依然可以使用這一特性,下面我們將上面的代碼改寫成Linq

1 var items = (from item in db.Table<StockTable>()
2                 where item.Symbol.StartsWith("F")
3                 select item).GetEnumerator();

筆者為了能夠更快的查看結果,所以使用了GetEnumerator,實際使用中不一定需要。如果讀者喜歡最原始的查詢可以用ExecuteScalar方法。

 

注:linq的查詢是屬於延遲查詢的,意味着在查詢的那一刻並沒有把結果查詢出來,而是等待你使用它的時候才查詢。

 

推薦:

1.Jesse Liu的隨筆《快樂的lambda表達式》,個人感覺很有意思,也很有用。

2.關於Linq如何實現動態查詢的文章點我,動態查詢可以認為是用字符串拼接Linq的部分語句,這樣做的目的是為了解決某些特殊場合下的使用。

關於查詢數據到此結束了,下面我們將學習剩下的兩個操作分別是更新和刪除。

 

7.更新和刪除數據

首先我們先將更新數據,因為它的操作跟插入數據是一樣的存在UpdateUpdateAll,只是數據的主鍵需要有數據,否則無法定位是更新哪個數據,下面我們將演示如何利用Update更新數據:

1 var result = (from item in db.Table<StockTable>()
2                   where item.Symbol.StartsWith("F")
3                   select item).First();
4 result.Symbol = "Third";
5 db.Update(result);
6 
7 result = db.Get<StockTable>(result.Id);

既然是更新當然需要先獲取一條數據然后更新,最后還要從數據庫中拿出來,確定是否已經更新成功。下面我們繼續刪除操作:

1 var result = (from item in db.Table<StockTable>()
2           where item.Symbol.StartsWith("T")
3           select item).First();
4 
5 db.Delete<StockTable>(result.Id);

如果你需要刪除整個表的數據只需要使用DeleteAll即可,當然這些操作都是有限的,所以我們還需要支持SQL的方法,那么我們可以使用Execute即可。

 

最后結果給大家一個本人比較喜歡ORM,用在網站開發上的

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM