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