Xamarin.Android开发实践(十)
Xamarin.Android之SQLiteOpenHelper
一、前言
在手机中进行网络连接不仅是耗时也是耗电的,而耗电却是致命的。所以我们就需要数 据库帮助我们存储离线数据,以便在用户未使用网络的情况下也可以能够使用应用的部分功能,而在需要网络连接的功能上采用提示方式,让用户决定是否打开网 络。而本节我们将会学习如何访问数据库以及提供基本的增删改查功能,并且使他们尽量的解耦。
二、数据库
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.。
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方法中初始化该数据库对象。
TestSQLiteOpenHelper dbHelper = new TestSQLiteOpenHelper(this);
但是我们还不能直接使用dbHelper访问数据库,必须通过它的WritableDatabase属性或ReadableDatabase属性获取对应权限的数据库访问对象,WritableDataBase可以对数据库进行全部操作,ReadableDatabase可以对数据库进行读取操作。他们的返回类型都是SQLiteDataBase。所以我们还要根据需要获取他们的对象。
SQLiteDatabase db = dbHelper.WritableDatabase;
这样我们就可以通过db的Insert、Update、Query和Delete进行操作了,当然也可以使用ExecSQL直接执行我们SQL语句。下面我们将逐一介绍这些方法的使用。
1.添加(Insert)
首先是该方法的定义:
public virtual long Insert(string table, string nullColumnHack, ContentValues values);
其中参数的含义如下:
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);
返回值则为所插入数据的主键。
2.查询(Query)
首先是该方法的定义:
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
3.更新(Update)
首先是该方法的定义:
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() });
这里的条件语句跟查询中的语句是类似的,然后我们查看获取的数据可以发觉的确发生了修改。
4.删除(Delete)
首先是该方法的定义:
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"));
Xamarin.Android开发实践(十)的更多相关文章
- Xamarin.Android开发实践(五)
原文:Xamarin.Android开发实践(五) 一.服务的生命周期 服务与活动一样,在它的整个生命周期中存在着一些事件,下图可以很好解释整个过程以及涉及到的方法: 在真实的使用中,Service来 ...
- Xamarin.Android开发实践(四)
原文:Xamarin.Android开发实践(四) Xamarin.Android下获取与解析JSON 一.新建项目 1.新建一个Android项目,并命名为为NetJsonList 2.右击引用,选 ...
- Xamarin.Android开发实践(三)
原文:Xamarin.Android开发实践(三) 一.前言 用过Android手机的人一定会发现一种现象,当你把一个应用置于后台后,一段时间之后在打开就会发现应用重新打开了,但是之前的相关的数据却没 ...
- Xamarin.Android开发实践(二)
原文:Xamarin.Android开发实践(二) 一.准备 开始学习本教程前必须先完成该教程http://www.cnblogs.com/yaozhenfa/p/xamarin_android_qu ...
- Xamarin.Android开发实践(一)
原文:Xamarin.Android开发实践(一) 一.准备工作 1.创建一个空的解决方案,并命名为Phoneword 2.右击解决方案 新建->新建项目 并命名为Phoneword_Droid ...
- Xamarin.Android开发实践(十五)
Xamarin.Android学习之应用程序首选项 一.前言 任何App都会存在设置界面,如果开发者利用普通控件并绑定监听事件保存设置,这 一过程会非常的枯燥,而且耗时.我们可以看到Android系统 ...
- Xamarin.Android开发实践(十四)
Xamarin.Android之ListView和Adapter 一.前言 如今不管任何应用都能够看到列表的存在,而本章我们将学习如何使用Xamarin去实现它,以及如何使用适配器和自定义适配器(本文 ...
- Xamarin.Android开发实践(十八)
Xamarin.Android之SlidingMenu 一.前言 有位网友在评论中希望能够出个在Xamarin.Android下实现SlidingMenu效果的随笔,刚好昨天在观看官网示例项目的时候也 ...
- Xamarin.Android开发实践(十六)
Xamarin.Android之Fragment Walkthrough 利用Fragment设计能够兼容不同屏幕的应用 这里我们先围观下最后的成果图,给读者打打气: 普通手机上显示的结果: 在平板上 ...
- Xamarin.Android开发实践(十二)
Xamarin.Android之ContentProvider 一.前言 掌握了如何使用SQLiteOpenHelper之后,我们就可以进行下一步的学习.本章我们将会学习如何使用ContentProv ...
随机推荐
- Java初学(二)
一.数据类型 在定义Long或者Float类型变量的时候,要加L或f(大小写无关,只是便于识别,建议不要小写L) 整数默认是int,浮点数默认是double 二.java字符 java语言采用的是Un ...
- 从HashMap透析哈希表
##扯数据结构 先看一下哈希表的概念: 哈希表是一种数据结构,它可以提供快速的插入操作和查找操作.第一次接触哈希表,他会让人难以置信,因为它的插入和删除.查找都接近O(1)的时间级别.用哈希表,很多操 ...
- Socket 入门- 客户端回射程序
结果输出:------------------------------------------------------客户端:xx@xxxxxx:~/Public/C$ ./postBackCli.o ...
- JS闭包(转载加整理)
原文地址:http://www.jb51.net/article/24101.htm 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.变量 ...
- LVS-DR工作原理
我们都知道LVS有LVS-DR,LVS-NAT,LVS-TUN三种模式,其中DR模式意为Direct Routing(直接路由).对于LVS-DR,你到底了解到什么程度?本文通过一个实例场景,详细介绍 ...
- cf.VK CUP 2015.C.Name Quest(贪心)
Name Quest time limit per test 2 seconds memory limit per test 256 megabytes input standard input ou ...
- Vim的使用方法
导读 Vim是从vi发展出来的一个文本编辑器.代码补全.编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用,和Emacs并列成为类Unix系统用户最喜欢的文本编辑器. 一.vi.vim介绍 ...
- 如何让Ubuntu系统支持WebP图片格式
本文主要向大家介绍如何让 Ubuntu 系统支持查看 WebP 图片格式,以及如何将 WebP 转为 JPEG 或 PNG 图片格式的方法. 什么是WebP图片 Google开发并推出 WebP 图片 ...
- [转]Spring的IOC原理[通俗解释一下]
1. IoC理论的背景我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 图1:软件系统中耦合的对象 如果我们打开机械 ...
- MVC ActionResult JsonResult
以下是ActionResult的继承图: 大概的分类: EmptyResult:表示不执行任何操作的结果 ContentResult :返回文本结果 JavaScriptResult:返回结果为Jav ...