程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> Xamarin.Android之SQLite.NET ORM,androidsqliteorm

Xamarin.Android之SQLite.NET ORM,androidsqliteorm

編輯:C#入門知識

Xamarin.Android之SQLite.NET ORM,androidsqliteorm


一、前言

通過《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,用在網站開發上的

 


aspnet 的框架有什?除了 mvc 三層 nhibernate 還有其他的 有好的orm 或者cmsl 成熟不錯的推薦

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來表示,但是它們也有可......余下全文>>
 

aspnet中ORM

orm是,五體投地的近義詞
orz哈哈
orm是持久層框架
用來訪問數據庫,目的是映射關系代數數據庫到面向對象,用面向對象語言操作關數據庫的增刪改等操作。——個人理解
一般orm是用反射實現,但是反射和orm是兩回事
反射是.net的特性不是框架。
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved