SQLite语法

SQLite是一个小巧的嵌入式数据库,使用方便、开发简单,手机上最早由ios运用,后来android兴起同样也采用了sqlite。sqlite的多数sql语法与oracle是一样的,下面只列出不同的地方:


1、建表时为避免重复操作,应加上“IF NOT EXISTS”关键词,例如:CREATE TABLE IF NOT EXISTS table_name


2、同样的,删表时为避免重复操作,应加上“IF EXISTS”关键词,例如:DROP TABLE IF EXISTS table_name


3、变更表结构使用ALTER TABLE table_name ADD COLUMN ...


4、SQLite支持如下字段类型:整型INTEGER、字符串VARCHAR、浮点数FLOAT,但不支持布尔类型


5、SQLite建表时需要一个唯一标识的字段,字段名为_id,所以每建一张新表都要例行公事加上该字段定义,具体属性定义为“_id INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL”




SQLiteDatabase

SQLiteDatabase是SQLite的数据库管理类,我们可在Activity页面代码或者任何能取到Context的地方获取数据库实例,参考代码如下:


//创建数据库,如果已存在则打开
		SQLiteDatabase db = getApplicationContext().openOrCreateDatabase("test.db", Context.MODE_PRIVATE, null);
		//删除数据库
		getApplicationContext().deleteDatabase("test.db");




SQLiteDatabase提供了若干操作数据表的API,常用的列举如下:



管理类

openDatabase : 打开指定路径的数据库


isOpen : 判断数据库是否已打开


close : 关闭数据库


getVersion : 获取数据库的版本号


setVersion : 设置数据库的版本号




事务类


beginTransaction : 开始事务


setTransactionSuccessful : 设置事务的成功标志


endTransaction : 结束事务。执行本方法时,系统会判断是否已执行setTransactionSuccessful,如之前已设置则提交,如没有设置则回滚。




增删改查


delete : 删除指定表名符合条件的记录


update : 更新指定表名符合条件的记录


insert : 对指定表名插入记录


execSQL : 直接执行拼接好的SQL语句


query : 对指定表名执行查询操作,返回结果集的游标


rawQuery : 直接执行拼接好的SQL查询语句,返回结果集的游标


需要注意的是,如果不设置事务,就直接进行增删改的操作,那么SQLite默认会提交成功的操作。




SQLiteOpenHelper

因为SQLiteDatabase存在局限性,例如必须小心不能重复打开数据库,还有app每次升级的同时升级数据库很不方便,所以Android提供了一个帮助工具,用于指导我们进行SQLite的合理使用,这个工具就是SQLiteOpenHelper。




我们新建一个数据库操作类继承自SQLiteOpenHelper,首先提示要重写onCreate和onUpgrade两个方法。其中onCreate只在第一次打开数据库时执行,而onUpgrade在打开数据库发现版本变化时都会执行,在onUpgrade函数内部,我们可以根据不同的新旧版本号进行相应的处理。




另外我们还得对该类运用单例模式,确保每次取出的数据库对象都是唯一的,这样就避免了重复打开数据库。废话少说,直接上该示例类的代码:


import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class TestDBHelper extends SQLiteOpenHelper {
	private static final String TAG = "TestDBHelper";
	
	private static final String DB_NAME = "test.mDB";
	private static final int DB_VERSION = 1;
	private static TestDBHelper mHelper = null;
	private SQLiteDatabase mDB = null;

	private TestDBHelper(Context context) {
		super(context, DB_NAME, null, DB_VERSION);
	}

	private TestDBHelper(Context context, int version) {
		super(context, DB_NAME, null, version);
	}

	public static TestDBHelper getInstance(Context context, int version) {
		if (version > 0 && mHelper == null) {
			mHelper = new TestDBHelper(context, version);
		} else if (mHelper == null) {
			mHelper = new TestDBHelper(context);
		}
		return mHelper;
	}

	public SQLiteDatabase openReadLink() {
		Log.d(TAG, "openReadLink");
		if (mDB == null || mDB.isOpen() != true) {
			mDB = mHelper.getReadableDatabase();
		}
		return mDB;
	}

	public SQLiteDatabase openLink() {
		Log.d(TAG, "openLink");
		if (mDB == null || mDB.isOpen() != true) {
			mDB = mHelper.getWritableDatabase();
		}
		return mDB;
	}

	public void closeLink() {
		Log.d(TAG, "closeLink");
		if (mDB != null && mDB.isOpen() == true) {
			mDB.close();
			mDB = null;
		}
	}
	
	public String getDBName() {
		if (mHelper != null) {
			return mHelper.getDatabaseName();
		} else {
			return DB_NAME;
		}
	}
	
	@Override
	public void onCreate(SQLiteDatabase db) {
		Log.d(TAG, "onCreate");
		String create_sql = "CREATE TABLE IF NOT EXISTS person ("
				+ "_id INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL ,"
				+ "name VARCHAR NOT NULL," + "age INTEGER  NOT NULL" + ")";
		Log.d(TAG, "create_sql:" + create_sql);
		db.execSQL(create_sql);
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		Log.d(TAG, "onUpgrade");
		if (newVersion == 10) {
			String alter_sql = "ALTER TABLE person ADD COLUMN company VARCHAR";
			Log.d(TAG, "alter_sql:" + alter_sql);
			db.execSQL(alter_sql);
		}
	}

}