背景概述
SQLite的特点
小型、单文件形式、B-Tree结构效率高、可嵌入、开源跨平台、关系型数据库、支持事务
实现方式介绍与对比
创建数据库的方式
- context.openOrCreateDatabase(name,mode,cursorFactory)
- 继承SQLiteOpenHelper并重写抽象方法
第一种方式打开或创建数据库,如果数据库存在,就打开,如果不存在,就先创建再打开。
但是其不具有扩展性,所以日常开发中并不建议这样使用,如果考虑到数据库的可操作性以及扩展性,建议实际项目中使用第二种方式。
操作数据库方式
- 执行原生SQL语句
- 使用SQLiteDatabase的相关API
常用可视化工具
- 数据库文件导出工具
- adb pull
- Android Device Monitor(Tools ->Android)
- 数据库文件查看工具
- sqlite3
- SQLite Professional
- SQLPro
SQLiteDatabase类介绍
- 提供访问SQLite数据库的方法
- 提供增删改查、执行SQL命令的方法,以及执行数据库管理任务
- 每个Application的数据库名必须唯一
SQLiteDatabase API概览
db.execSQL(sql)
db.insert(table,nullCol,contentValues)
db.delete(table,whereClause,whereArgs)
db.update(table,contentValues,whereClause,whereArgs)
db.query(table,columns,selection,selectionArgs,groupBy,having,orderBy)
数据库的创建
- SQLiteOpenHelper
- SQLiteDatabase的帮助类,用于管理数据库的创建和更新
- SQLiteOpenHelper常用方法
- onCreate 创建方法
- onOpen 打开方法
- onUpgrade 升级方法
- getReadableDatabase 获取SQLiteDatabase对象
- getWritableDatabase 获取SQLiteDatabase对象
private static final String CREATE_COURSE="create table course ("+
"id integer primary key autoincrement, "+
"name text)";
private Context mContext;
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_COURSE);
Toast.makeText(mContext,"数据库创建成功", Toast.LENGTH_LONG).show();
}
当已经存在数据库时,再次获取SQLiteDatabase对象将不会再调用onCreate方法。
数据库的升级
private static final String CREATE_TEACHER="create table Teacher("
+"id integer primary key autoincrement,"
+"name text,"
+"age integer,"
+"desc text";
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists Course");
db.execSQL(CREATE_TEACHER);
}
如果传进来的newVersion版本号大于oldVersion,就会执行onUpgrade方法
数据增删改操作
通过execSQL()方法,传入SQL语句,即可执行增删改操作
增加数据
SQLiteDatabase db = databaseHelper.getWritableDatabase();
db.execSQL("insert into course values (?,?)",new String[]{"2","张三"});
修改数据
SQLiteDatabase db = databaseHelper.getWritableDatabase();
db.execSQL("update course set name=? where id=?",new String[]{"李四","2"});
删除数据
SQLiteDatabase db = databaseHelper.getWritableDatabase();
db.execSQL("delete from course where id=?",new String[]{"2"});
除了上面的通过SQL语句的方式进行增删该,还可以通过SQLiteDatabase提供的API进行增删改
增加数据
增加数据,需要传入ContentValues,ContentValues即是键值对的集合,相当于HashMap
ContentValues values=new ContentValues();
values.put("id", "2");
values.put("name", "张三");
db.insert("course",null,values);
修改数据
ContentValues values=new ContentValues();
values.put("name", "李四");
db.update("course", values, "id=?", new String[]{"2"});
删除数据
db.delete("course", "id=?", new String[]{"1"});
数据查询操作
对于数据的查询,也是使用SQLiteDatabase对象,它有两个查询的方法
- db.query(table,columns,selection,selectionArgs,groupBy,having,orderBy),通过API来查询
- db.rawQuery(sql,selectionArgs),通过原生的SQL语句进行查询
Cursor
上面方法的返回值是Cursor,游标接口,提供遍历查询结果的方法
Cursor常用方法
getCount() //总记录条数
isFirst() //是否为第一条记录
isLast() //是否为最后一条记录
moveToFirst() //移动到第一条记录
moveToLast() //移动到最后一条记录
moveToNext() //移动到下一条记录
moveToPrevious() //移动到前一条记录
getInt(int columnIndex) //获取指定列索引的int值
getString(int columnIndex) //获取指定列索引的String值
使用SQL语句进行查询
Cursor cursor = db.rawQuery("select * from course", null);
if(cursor.moveToFirst()){
do{
String name= cursor.getString(cursor.getColumnIndex("name"));
}while(cursor.moveToNext());
}
//释放游标
cursor.close();
通过API进行查询
Cursor cursor = db.query("course", null, null, null, null, null, null);
数据库事务操作
事务的概念
通常包含了对数据库读、写的一个序列的操作
ACID性质
原子性:所有操作要么全部执行,要么全不执行
一致性:满足完整性约束
隔离性:多个并发执行时,一个事务的执行不影响其他事务的执行
持久性:已被提交的事务对数据库的修改应该是永久保存在数据库中的
SQLite中实现事务
首先通过beginTransaction来开启事务,当操作都执行成功了,调用setTransactionSuccessful来标志这些操作都执行成功了,最后通过endTransaction来结束事务。
db.beginTransaction();
try {
db.execSQL(sql1);
db.execSQL(sql2);
db.setTransactionSuccessful();
} catch (SQLException e) {
e.printStackTrace();
}finally{
db.endTransaction();
}
通过try...catch...finally...一旦没有执行setTransactionSuccessful()方法,直接endTransaction(),那么SQLite将会回滚到其之前的状态