原文:Xamarin.Android開發實踐(十)html
在手機中進行網絡鏈接不只是耗時也是耗電的,而耗電倒是致命的。因此咱們就須要數 據庫幫助咱們存儲離線數據,以便在用戶未使用網絡的狀況下也能夠可以使用應用的部分功能,而在須要網絡鏈接的功能上採用提示方式,讓用戶決定是否打開網 絡。而本節咱們將會學習如何訪問數據庫以及提供基本的增刪改查功能,而且使他們儘可能的解耦。數據庫
Xamarin.Android下建立本地數據庫與在Java下的方式相同,而咱們必須掌握使用SQLiteOpenHelper,由於這個類會簡化咱們建立數據的步驟,讓咱們只須要關注建立數據庫中的表,並在數據庫版本須要更新時進行操做。其中咱們必須實現OnCreate方法和OnUpgrade方法,OnCreate方法僅會在數據庫不存在的狀況下才執行,因此不會重複執行。好比下面的代碼。網絡
1 class LocationSqliteOpenHelper : SQLiteOpenHelper 2 { 3 public override void OnCreate(SQLiteDatabase db) 4 { 5 } 6 7 public override void OnUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 8 { 9 } 10 }
可是咱們還須要使用父類的構造函數,指定數據庫的名稱以及初始版本。好比下面的代碼咱們將建立一個名爲「test」的數據,而且初始版本爲1.。ide
1 class LocationSqliteOpenHelper : SQLiteOpenHelper 2 { 3 public LocationSqliteOpenHelper(Context context) 4 : base(context, 「test」, null,1) 5 { 6 } 7 }
學會了上面的操做,下面咱們就能夠建立一個名爲Test的數據庫,而且該數據庫中含有一個USER表(SQLite數據庫下的主鍵須要爲INTEGER類型,而且是自增的)。函數
1 public class TestSQLiteOpenHelper : SQLiteOpenHelper 2 { 3 public TestSQLiteOpenHelper(Context context) 4 : base(context, "Test", null, 1) 5 { 6 } 7 8 public override void OnCreate(SQLiteDatabase db) 9 { 10 db.ExecSQL("CREATE TABLE USER(id INTEGER PRIMARY KEY NOT NULL,uname TEXT NOT NULL,upwd TEXT NOT NULL)"); 11 } 12 13 public override void OnUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 14 { 15 db.ExecSQL("DROP TABLE IF EXISTS USER"); 16 OnCreate(db); 17 } 18 }
建立了數據庫對象,下面咱們就能夠利用這個對象對數據庫進行操做了,首先咱們須要在MainActivity中的OnCreate方法中初始化該數據庫對象。post
TestSQLiteOpenHelper dbHelper = new TestSQLiteOpenHelper(this);
可是咱們還不能直接使用dbHelper訪問數據庫,必須經過它的WritableDatabase屬性或ReadableDatabase屬性獲取對應權限的數據庫訪問對象,WritableDataBase能夠對數據庫進行所有操做,ReadableDatabase能夠對數據庫進行讀取操做。他們的返回類型都是SQLiteDataBase。因此咱們還要根據須要獲取他們的對象。學習
SQLiteDatabase db = dbHelper.WritableDatabase;
這樣咱們就能夠經過db的Insert、Update、Query和Delete進行操做了,固然也可使用ExecSQL直接執行咱們SQL語句。下面咱們將逐一介紹這些方法的使用。this
首先是該方法的定義:url
public virtual long Insert(string table, string nullColumnHack, ContentValues values);
其中參數的含義以下:spa
table:須要插入的表名。
nullColumnHack:當values爲空或裏面的值都爲空時,數據庫是不容許插入一個空行的,若是須要插入空行,則須要指定一個字段名稱,這樣當發生如上狀況後將會將該字段設爲NULL而後在嘗試插入。
values:須要插入的數據。
關於前兩個參數很簡單不用過多介紹,如要介紹的是最後一個參數,它是一個ContentValues類型,經過它咱們能夠大大的簡化本身拼接插入語句的繁瑣,好比下面咱們能夠設置uname字段的值爲yzf,upwd的值爲123。
1 ContentValues cv = new ContentValues(); 2 cv.Put("uname","yzf"); 3 cv.Put("upwd","123");
關鍵就是Put方法,它擁有如下的重載方法。
1 public void Put(string key, bool value); 2 public void Put(string key, byte[] value); 3 public void Put(string key, double value); 4 public void Put(string key, float value); 5 public void Put(string key, int value); 6 public void Put(string key, long value); 7 public void Put(string key, sbyte value); 8 public void Put(string key, short value); 9 public void Put(string key, string value);
經過這些重載方法咱們就能夠插入不一樣類型的參數了,固然咱們也能夠經過Remove方法刪除,若是咱們須要爲某個字段插入NULL值可使用PutNull方法,判斷某個字段是否存在能夠用ContainsKey方法,最後就是對應的獲取不一樣字段的值。
1 public Object Get(string key); 2 public bool GetAsBoolean(string key); 3 public sbyte GetAsByte(string key); 4 public byte[] GetAsByteArray(string key); 5 public double GetAsDouble(string key); 6 public float GetAsFloat(string key); 7 public int GetAsInteger(string key); 8 public long GetAsLong(string key); 9 public short GetAsShort(string key); 10 public string GetAsString(string key);
簡單的介紹完ContentValues的使用,下面咱們將使用它來添加一條數據,好比下面的代碼將添加一條數據到User表中。
long id = db.Insert("User", null, cv);
返回值則爲所插入數據的主鍵。
首先是該方法的定義:
1 public virtual ICursor Query(string table, string[] columns, string selection, string[] selectionArgs, string groupBy, string having, string orderBy); 2 public virtual ICursor Query(string table, string[] columns, string selection, string[] selectionArgs, string groupBy, string having, string orderBy, string limit); 3 public virtual ICursor Query(bool distinct, string table, string[] columns, string selection, string[] selectionArgs, string groupBy, string having, string orderBy, string limit);
其中參數的含義以下:
table:須要查詢的表名
columns:須要獲取的字段,若是傳入null則表示獲取全部字段
selection:條件語句,其中咱們能夠實用」?」做爲參數的佔位符(不一樣於SQL SERVER中的@)
selectionArgs:條件參數,用於替換查詢語句中的」?」
groupBy:分組語句
having:分組條件
orderBy:排序語句
limit:分頁語句(如」1,3」表示獲取第1到第3的數據共3條)
以前經過Insert插入的數據,此時咱們能夠經過Query方法從數據庫中獲取,好比下面的代碼
ICursor ic = db.Query("User", new string[] { "id", "uname", "upwd" }, " id = ? ", new string[] { id.ToString() }, null, null, null);
該方法最後會返回一個實現了ICursor接口的對象,利用這個接口咱們就能夠從中獲取數據了,下面咱們獲取其中的用戶名和密碼
1 ic.MoveToFirst(); 2 string uname = ic.GetString(ic.GetColumnIndex("uname")); 3 string upwd = ic.GetString(ic.GetColumnIndex("upwd"));
由於ICursor是針對一個結果集的,因此咱們須要先定位到第一條數據,因此採用MoveToFirst方法,而後經過GetString獲取參數,可是還須要傳遞一個字段的位置,因此咱們還須要使用GetColumnIndex獲取指定字段名稱的位置。
下面是關於ICursor方法的介紹
Count:獲取多少條數據
IsAfterLast:當前是否在最後一條數據以後
IsBeforeFirst:當前是否在第一條數據以前
IsClosed:是否已關閉
IsFirst:是不是第一條數據
IsLast:是不是最後一條數據
Position:當前位置
GetColumnIndex:根據字段名獲取位置,若是不存在該字段則返回-1
GetColumnName:根據位置獲取字段名
MoveToFirst:移動到第一條數據
MoveToFirst:移動到最後一條數據
MoveToNext:移動到下一條數據
MoveToPosition:移動指定的位置
MoveToPrevious:移動到上一條數據
如下是根據位置獲取對應類型的數據
GetDouble,GetFloat,GetInt,GetLong,GetShort,GetString
首先是該方法的定義:
Update(string table, ContentValues values, string whereClause, string[] whereArgs);
其中參數的含義以下
table:須要更新的數據所在的表
values:更新後字段的值
whereClause:查詢語句
whereArgs:查詢語句中須要的參數
有了插入、查詢數據的幫助下,咱們能夠在插入數據以後更新這條數據,而後再經過Query獲取該數據,查看數據的是否變更。
1 ContentValues ncv = new ContentValues(); 2 ncv.Put("uname", "zn"); 3 ncv.Put("upwd", "456"); 4 db.Update("User", ncv, " id = ? ", new string[] { id.ToString() });
這裏的條件語句跟查詢中的語句是相似的,而後咱們查看獲取的數據能夠發覺的確發生了修改。
首先是該方法的定義:
public virtual int Delete(string table, string whereClause, string[] whereArgs);
關於參數的說明跟Update是相同的,因此實用方式這裏就不作介紹了。
所有實例的所有代碼以下所示:
TestSQLiteOpenHelper.cs
1 public class TestSQLiteOpenHelper : SQLiteOpenHelper 2 { 3 public TestSQLiteOpenHelper(Context context) 4 : base(context, "Test", null, 1) 5 { 6 } 7 8 public override void OnCreate(SQLiteDatabase db) 9 { 10 db.ExecSQL("CREATE TABLE USER(id INTEGER PRIMARY KEY NOT NULL,uname TEXT NOT NULL,upwd TEXT NOT NULL)"); 11 } 12 13 public override void OnUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 14 { 15 db.ExecSQL("DROP TABLE IF EXISTS USER"); 16 OnCreate(db); 17 } 18 }
MainActivity的OnCreate中
1 TestSQLiteOpenHelper dbHelper = new TestSQLiteOpenHelper(this); 2 SQLiteDatabase db = dbHelper.WritableDatabase; 3 4 ContentValues cv = new ContentValues(); 5 cv.Put("uname","yzf"); 6 cv.Put("upwd","123"); 7 long id = db.Insert("User", null, cv); 8 9 ContentValues ncv = new ContentValues(); 10 ncv.Put("uname", "zn"); 11 ncv.Put("upwd", "456"); 12 db.Update("User", ncv, " id = ? ", new string[] { id.ToString() }); 13 14 ICursor ic = db.Query("User", new string[] { "id", "uname", "upwd" }, " id = ? ", new string[] { id.ToString() }, null, null, null); 15 ic.MoveToFirst(); 16 string uname = ic.GetString(ic.GetColumnIndex("uname")); 17 string upwd = ic.GetString(ic.GetColumnIndex("upwd"));