日期:2014-05-16  浏览次数:20769 次

Android+Jquery Mobile学习系列(5)-SQLite数据库
目录导航

?

SQLite是轻量级的、嵌入式的、关系型数据库,目前已经在iPhone、Android等手机系统中使用,SQLite可移植性好,很容易使用,很小,高效而且可靠。

?

因为Android已经集成了SQLite,所以开发人员无需引入任何JAR包,而且Android也针对SQLite封装了专属的API,调用起来非常快捷方便。

?

我也是第一次接触SQLite,感受到它的一些不同之处,作为一门简易实用的数据库,它的学习周期其实蛮短的。对于懂关系型数据库的人来说,使用SQLite应该是得心应手的。

?

Android支持很多类型的存储方式,比如File文件、sharedPreference和数据库等,因为我做的应用涉及到频繁的更新操作,而且数据组成较为复杂,所以最终选择了SQLite数据库作为应用的存储方式。但是听有经验的开发人员说,在Android上使用数据文件存储极其不好,只要有ROOT权限就可以随意删除文件,所以如果你的应用属于商业性质,我推荐你做一个网络站点将数据存储于网络服务器上最好。

?

  • 特性?

不需要配置,不需要安装,也不需要管理员。SQLite不需要安装任何数据库相关的服务器,一个完整的数据库保存在磁盘上面一个文件,要想用数据库工具查看SQLite只需要将它指向那个数据库文件即可!

?

源代码开放, 代码95%有较好的注释。

?

完美支持大部分的标准SQL语句。如果你懂得MYSql、Oracle等关系型数据的使用,那么用SQLite也是得心应手。

?

SQLite最大的特点是,数据表中的字段是无类型的,这意味着你可以保存任何类型的数据到你所想要保存的任何表的任何列中(除了integer Primary Key)。我的理解是:一张表上的主键必须指定数据类型,而且存储更新时,主键的数据类型一定要对应;而其它的字段全部都是无类型的,你可以存字符串,也可以存int整数。

所以在建表的时候你可以这样写:

?

CREATE TABLE IF NOT EXISTS user_info (id INTEGER PRIMARY KEY,name,sex)
除了主键外,其它字段均不用定义数据类型,即使定义了数据类型,SQLite也会忽略掉。

?

但是很多人还是建议带上数据类型,一来尽量让建表语句标准化便于迁移,二来让后面维护的开发人员理解每个字段到底是什么类型。

?

CREATE TABLE IF NOT EXISTS user_info (id INTEGER PRIMARY KEY,name VARCHAR(99),sex INTEGER )
?

?

假设主键是自增的,当insert一条数据到数据库中,获取自增主键的值可以这样写:

?

SELECT last_insert_rowid()
?

?

  • 新增数据库

任何数据库都要先从建库和建表开始,因为我是做Android应用,所以直接通过JAVA程序来建库和建表,以后表的更新也是通过程序实现,这些功能都基于Android SQLite的SQLiteOpenHelper实现,非常地方便。

?

首先要了解这个核心抽象类SQLiteOpenHelper,既然是抽象类,我们就要创建一个实体类继承并实现SQLiteOpenHelper。

?

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;

public class DBHelper extends SQLiteOpenHelper {

	public SQLHelper(Context context, String name, CursorFactory factory,
			int version) {
		super(context, name, factory, version);
	}

	@Override
	public void onCreate(SQLiteDatabase sqlitedatabase) {
	}

	@Override
	public void onUpgrade(SQLiteDatabase sqlitedatabase, int i, int j) {
	}

}
?

?

构造方法四个参数:

Context指Android的上下文,Activity就继承了Context,所以在Activity中可以将对象传入构造方法中;

name指数据库名称,所以一个实体类操作一个数据库;

CursorFactory游标工厂,用于执行查询操作时控制Cursor游标对象的,传入null就表示使用系统默认游标工厂;

version当前数据库版本,这个很重要,涉及到后面的onCreate和onUpgrade方法调用,这个必须是一个整数,没有特别要求你一定必须是哪个值,我的个人建议是第一次创建时设置version为1,随后每次更新表和字段时+1。(这个下面会说怎么回事)

?

关于构造函数的实现,我的代码是这么做的(实例化对象时,直接调用DBHelper(Context context)这个构造函数):

?

private static final String DATABASE_NAME = "bless_crm.db";  
private static final int DATABASE_VERSION = 1;
	
	public DBHelper(Context context) {
        //CursorFactory设置为null,使用默认值 
        super(context, DATABASE_NAME, null, DATABASE_VERSION);  
    }  
	
	public DBHelper(Context context, String name, CursorFactory factory,
			int version) {
		super(context, name, factory, version);
	}
?

?

要注意,并不是new DBHelper就创建了数据库,第一次创建表必须调用DBHelper的getWritableDatabase()或getReadableDatabase()方法。这个两个方法除了可以创建数据库以外,还可以更新数据库下数据表的信息,所以我建议每次打开Android应用实例化DBHelper时都调用下这个方法,这个不会对应用造成什么特殊影响。

?

下面是在主Activity上实例化DBHelper,启动Android应用,会首先执行这个Activity,所以在这个类里初始化SQLite数据库是最佳的。

?

public class MainActivity extends Activity{
    DBHelper helper = null;
    protected void onCreate(B