原文: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"));