通過《Xamarin.Android之SQLiteOpenHelper》和《Xamarin.Android之ContentProvider》的學習,我們已經掌握了如何使用特定於該平台的數據庫操作。但是這樣卻和Xamarin所宣稱的跨平台相違背了,因為這樣我們就需要針對不同的平台編寫不同的代碼,而本章將使用Github上的開源項目SQLite.NET去解決這個問題,從而可以實現跨平台,減少代碼的重復。
關於該開源項目請點我
因為這個庫很大,而我們只需要其中的一個.cs文件就可以了,所以筆者這裡已經封裝好了一個庫,裡面不僅包含了這個庫,還包含了可以跨平台的網絡連接。
點我下載
因為該庫還使用了一個json庫,所以讀者也一並要下載並引用
點我下載
然後新建一個Android Application項目(.net 4.0)並且SDK版本設置為14(Android 4.0),下面我們就可以開始正式學習了。
打開MainActivity類並在頂部加上如下引用
1 using NSCPAndroid.SQLite;
有過一定開發經驗的人一定會很熟悉ORM,筆者平時用的最多的就是EF、Castle 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]:表示該屬性的值必須在表中唯一。
我們需要指定數據庫所保存的路徑,同時還要打開該數據庫。如果不存在該數據庫,則會自動創建該文件。下面的代碼我們將獲取數據庫的路徑並打開該數據庫:
1 string dbPath = Path.Combine(System.Environment. 2 GetFolderPath(System.Environment.SpecialFolder.Personal),"ormdemo.db3"); 3 var db = new SQLiteConnection(dbPath);
這裡要注意我們用的是SQLiteConnection打開該數據庫的,而不是SqlConnection。成功打開該數據庫之後剩下的工作我們只需要利用db就可以輕松完成了,到現在為止我們僅僅創建了一個空的數據庫,裡面還不存在任何表。
第2步我們已經創建好了一個表的結構,下面我們將在數據庫中創建對應的表,我們只需要通過下面的代碼就可以輕松的創建一個表了:
1 db.CreateTable<StockTable>();
或者下面這個方式也一樣可以:
1 db.CreateTable(typeof(StockTable));
創建完之後表還是空的,所以接下來我們需要插入幾條數據,這樣才能介紹其他的操作。
注:實際運用中一定會有人想找如何判斷該表是否已經創建的方法,其實沒有必須要找,即使重復的執行該操作,也不會影響什麼,表一旦創建之後在執行就不會重新創建了。
這裡我們直接通過創建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();
這時表裡已經有數據了,下面我們就需要進行查詢。
首先介紹最簡單的查詢方式,就是依靠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的部分語句,這樣做的目的是為了解決某些特殊場合下的使用。
關於查詢數據到此結束了,下面我們將學習剩下的兩個操作分別是更新和刪除。
首先我們先將更新數據,因為它的操作跟插入數據是一樣的存在Update和UpdateAll,只是數據的主鍵需要有數據,否則無法定位是更新哪個數據,下面我們將演示如何利用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,用在網站開發上的
MVC (Modal View Controler)本來是存在於Desktop程序中的,M是指數據模型,V是指用戶界面,C則是控制器。使用MVC的目的是將M和V的實現代碼分離,從而使同一個程序可以使用不同的表現形式。比如一批統計數據你可以分別用柱狀圖、餅圖來表示。C存在的目的則是確保M和V的同步,一旦M改變,V應該同步更新。
模型-視圖-控制器(MVC)是Xerox PARC在八十年代為編程語言Smalltalk-80發明的一種軟件設計模式,至今已被廣泛使用。最近幾年被推薦為Sun公司J2EE平台的設計模式,並且受到越來越多的使用 ColdFusion 和 PHP 的開發者的歡迎。模型-視圖-控制器模式是一個有用的工具箱,它有很多好處,但也有一些缺點。
MVC如何工作
MVC是一個設計模式,它強制性的使應用程序的輸入、處理和輸出分開。使用MVC應用程序被分成三個核心部件:模型、視圖、控制器。它們各自處理自己的任務。
視圖
視圖是用戶看到並與之交互的界面。對老式的Web應用程序來說,視圖就是由HTML元素組成的界面,在新式的Web應用程序中,HTML依舊在視圖中扮演著重要的角色,但一些新的技術已層出不窮,它們包括Macromedia Flash和象XHTML,XML/XSL,WML等一些標識語言和Web services.
如何處理應用程序的界面變得越來越有挑戰性。MVC一個大的好處是它能為你的應用程序處理很多不同的視圖。在視圖中其實沒有真正的處理發生,不管這些數據是聯機存儲的還是一個雇員列表,作為視圖來講,它只是作為一種輸出數據並允許用戶操縱的方式。
模型
模型表示企業數據和業務規則。在MVC的三個部件中,模型擁有最多的處理任務。例如它可能用象EJBs和ColdFusion Components這樣的構件對象來處理數據庫。被模型返回的數據是中立的,就是說模型與數據格式無關,這樣一個模型能為多個視圖提供數據。由於應用於模型的代碼只需寫一次就可以被多個視圖重用,所以減少了代碼的重復性。
控制器
控制器接受用戶的輸入並調用模型和視圖去完成用戶的需求。所以當單擊Web頁面中的超鏈接和發送HTML表單時,控制器本身不輸出任何東西和做任何處理。它只是接收請求並決定調用哪個模型構件去處理請求,然後用確定用哪個視圖來顯示模型處理返回的數據。
現在我們總結MVC的處理過程,首先控制器接收用戶的請求,並決定應該調用哪個模型來進行處理,然後模型用業務邏輯來處理用戶的請求並返回數據,最後控制器用相應的視圖格式化模型返回的數據,並通過表示層呈現給用戶。
為什麼要使用 MVC
大部分Web應用程序都是用像ASP,PHP,或者CFML這樣的過程化語言來創建的。它們將像數據庫查詢語句這樣的數據層代碼和像HTML這樣的表示層代碼混在一起。經驗比較豐富的開發者會將數據從表示層分離開來,但這通常不是很容易做到的,它需要精心的計劃和不斷的嘗試。MVC從根本上強制性的將它們分開。盡管構造MVC應用程序需要一些額外的工作,但是它給我們帶來的好處是無庸質疑的。
首先,最重要的一點是多個視圖能共享一個模型,正如我所提及的,現在需要用越來越多的方式來訪問你的應用程序。對此,其中一個解決之道是使用MVC,無論你的用戶想要Flash界面或是 WAP 界面;用一個模型就能處理它們。由於你已經將數據和業務規則從表示層分開,所以你可以最大化的重用你的代碼了。
由於模型返回的數據沒有進行格式化,所以同樣的構件能被不同界面使用。例如,很多數據可能用HTML來表示,但是它們也有可......余下全文>>
orm是,五體投地的近義詞
orz哈哈
orm是持久層框架
用來訪問數據庫,目的是映射關系代數數據庫到面向對象,用面向對象語言操作關數據庫的增刪改等操作。——個人理解
一般orm是用反射實現,但是反射和orm是兩回事
反射是.net的特性不是框架。