Android开发笔记(三十)SQLite数据库基础操作

这篇博客介绍了Android中SQLite数据库的基础操作,包括SQLite的语法、SQLiteDatabase的使用以及SQLiteOpenHelper管理类的详细讲解。并提供了一个单例模式的实践示例。

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);
		}
	}

}



点击下载本文用到的SQLite数据库操作的工程代码



点此查看Android开发笔记的完整目录




一.创建一个DataBaseHelper DataBaseHelper是一个访问SQLite的助类,提供两个方面的功能 1.getReadableDatebase(),getWriteableDatabase()可以获取SQLiteDatabase对象,通过 2.提供了onCreate()和onUpdate()两个回调函数,允许我们常见和升级数据库是进行使用 A、 在SQLiteOpenHelper的子类当中,必须要有的构造函数 B、该函数是在第一次创建数据库的时候执行,实际上是在第一次得到SQLiteDataBase对象的时候onCreate 二、创建一个实体person类并且给字段和封装 三、创建一个业务类对SQL的CRUD操作 1.getWritableDatabase()和getReadableDatabase()的区别 ,两个方法都可以获取一个用于操作数据库SQLiteDatabase实例 2.execSQL(增,删,改都是这个方法)和close();android内部有缓存可关闭也不关闭也行,查询rawQuery是方法 3.在分页有到Cursor(游标)取游标下一个值cursor.moveToNext(),用游标对象接数据 "select * from person limit ?,?" person不能加上where 关键字 4.在删除注意:sb.deleteCharAt(sb.length() - 1); 四、AndroidCRUD业务对SQLite的CRUD操作 1.ContentValues对象的使用 2.android内部insert添加数据的方法,而且values这个不给值也必须要执行,而主键是不是null的其他字段的值是为null 3.insert update query delete 五、单元测试类要注意的 AndroidCRUDService curdService = new AndroidCRUDService(this.getContext()); /* * 注意:getContext必须在我们使用前已经注解进去的,在使用前要实力化,而且是使用后才有上下文 *一般设置为局部对象 */ 六、AndroidManifest.xml的配置 <!-- 配置用户类库android.test.runner测试 --> package jll.sqlitedb; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteDatabase.CursorFactory; /** * *@author Administrator DataBaseHelper是一个访问SQLite的助类,提供两个方面的功能 * 1.getReadableDatebase(),getWriteableDatabase()可以获取SQLiteDatabase对象,通过 * 2.提供了onCreate()和onUpdate()两个回调函数,允许我们常见和升级数据库是进行使用 */ public class DataBaseHelper extends SQLiteOpenHelper { // 给一个默认的SQLite数据库名 private static final String DataBaseName = "SQLite_DB"; private static final int VERSION = 2; // 在SQLiteOpenHelper的子类当中,必须要有的构造函数 public DataBaseHelper(Context context, String name, CursorFacto
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值