SQLite只是一个嵌入式的数据库引擎,专门适用于资源有限的设备商适量数据存储(SQLite数据库只是一个文件)
Android提供了SQLiteDatabase代表一个数据库,一旦应用程序获得了代表指定数据库的SQLiteDatabase对象,接下来就可通过SQLiteDatabase对象来管理、操作数据库了
有如下静态方法来打开一个文件对应的数据库
static SQLiteDatabase openDatabase(String path, SQLiteDatabase.CursorFactory factory, int flags)
|
打开path文件所代表的SQLite数据库
|
static SQLiteDatabase openOrCreateDatabase(File file, SQLiteDatabase.CursorFactory factory)
|
打开或创建file文件所代表的SQLite数据库
|
static SQLiteDatabase openOrCreateDatabase(String path, SQLiteDatabase.CursorFactory factory)
|
|
获取SQLiteDatabase对象之后,接下来就可以调用SQLiteDatabase的如下方法来操作数据库了
execSQL(String sql, Object[] bindArgs)
|
执行带占位的SQL语句
|
execSQL(String sql)
|
|
insert(String table,String nullColumnHack, ContentValues values)
|
向执行表中插入数据
|
update(String table, ContentValues values, String whereClause, String[] whereArgs)
|
更新指定表中特定数据
|
delete(String table, String whereClause, String[] whereArgs)
|
删除指定表中特定数据
|
Cursor query(String table, String[] columns, String whereClause, String[] whereArgs, String groupBy,String having, String orderBy)
|
|
Cursor query(String table, String[] columns, String whereClause, String[] whereArgs, String groupBy,String having, String orderBy, String limit)
|
limit控制最多查询几条记录(用于控制分页的参数)
|
Cursor query(boolean distinct, String table, String[] columns, String whereClause, String[] whereArgs, String groupBy, String having, String orderBy, String limit)
|
第一个参数控制是否去除重复值
|
rawQuery(String sql, String[] selectionArgs)
|
执行带占位符的SQL查询
|
beginTransaction()
|
开始事务
|
endTransaction()
|
结束事务
|
Android考虑到部分开发者对SQL语法不熟悉,所以提供了上述方法
上述查询方法都是返回一个Cursor,Cursor同样提供如下方法来移动查询结果的记录指针
move(int offset)
|
将记录指针向上或向下移动指定行数(负则为上)
|
boolean moveToFirst()
|
|
boolean moveToLast()
|
|
boolean moveToNext()
|
|
boolean moveToPosition(int position)
|
|
boolean moveToPrevious()
|
将记录指针移动到上一行
|
一旦记录指针移动到指定行之后,接下来就可以调用Cursor的getXxx()方法获取该行的指定列数据
创建数据库和表
SQLiteDatabase.openOrCreateDatabase(“/mnt/db/temp.db3”,null);
上面代码中没有指定SQLiteDatabase.CursorFactory参数,该参数是一个用于返回Cursor的工厂,若指定为null,则意味着使用默认工厂
sql = “create table user_if(user_id integer primary key ,”
+” user_name varchar(255),"
+” user_pass varchar(255))"
db.execSQL(sql);
上面的代码即可在数据库中创建一个数据表
如果需要执行查询语句,则可调用SQLiteDatabase的rawQuery(String sql,String[] selectionArgs)方法,例如
db.execSQL(“insert into news_if values(null,? , ?)"
,new String[]{title, content});
sqlite3工具
一个简单的SQLite数据库管理工具,sqlite3中常用命令:
- .databases
- .tables
- .help
SQLite内部只支持NULL、INTEGER、REAL、TEXT和BLOB这5种类型,但实际上SQLite亦可接受varchar(n)、char(n)、decimal(p,s)等数据类型,只不过SQLite会在运算或保存时将它们转化为上面5种类型。
另外,SQLite还允许把各种类型的数据保存到任何类型字段中,开发者可以不用关心声明该字段所使用的数据类型;但有一种情况例外:定义为INTEGER PRIMARY KEY的字段只能存储64位整数,当向这种字段保存除整数以外的其他类型数据时,会出错
create table my_test
{
_id integer primary key auto increment,
name,
pass,
gender
}
使用特定方法操作SQLite数据库
SQLiteDatabase提供了insert、update、delete、query来操作数据库
SQL语法可以说是基本功中的基本功
事务
SQLiteDatabase中包含如下两个方法来控制事务
beginTransaction()
endTransaction()
当程序执行endTransaction()方法时会结束事务——那到底是提交事务呢,还是回滚事务呢?这取决于SQLiteDatabase是否调用了setTransactionSuccessful()方法来设置事务标志,如果设置了则提交事务,否则回滚事务
另外,SQLiteDatabase还提供了如下方法来判断当前上下文是否处于事务环境中
inTransaction()
//示例代码
db.beginTransaction();
try
{
...
db.setTransactionSuccessful();
}
finally
{
db.endTransaction();
}
SQLiteOpenHelper 类
实际项目中很少使用SQLiteDatabase的方法来打开数据库,通常都会继承SQLiteOpenHelper开发子类,并通过该子类的getReadableDatabase()、getWritableDatabase()方法打开数据库
一般用法是创建SQLiteOpenHelper子类,并扩展它的onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)方法
SQLiteOpenHelper包含如下常用方法:
synchronized SQLiteDatabase getReadableDatabase()
|
以读写方式打开
|
synchronized SQLiteDatabase getWriteableDatabase()
|
以写的方式打开
|
abstract void onCreate(SQLiteDatabase db)
|
当第一次创建数据库时回调
|
abstract void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
|
当数据库版本更新时回调
|
synchronized void close()
|
关闭所有打开的SQLIteDatabase
|
重写onCreate(),可以生成数据库表结构及添加一些应用使用到的初始化数据
只要某次创建SQLiteOpenHelper时指定的数据库版本号高于之前指定的版本号,系统就会自动触发onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)方法