Android系统的基础架构中内置了sqlite库,使得Android原生就支持了数据库的操作。
数据库对象的获取
从面向对象出发,既然是数据库的操作,就要先拿到数据库的对象,Android中提供了如下几个方法供我们得到数据库对象:
- SQLiteDatabase的静态方法
//openOrCreateDatabase 实际上调用的也是openDatabase SQLiteDatabase.openDatabase(String path,CursorFactory factory,int flags,DatabaseErrorHandler errorHandler)
- Context中直接打开
context.openOrCreateDatabase(String name,int mode, CursorFactory factory,DatabaseErrorHandler errorHandler)
- SQLiteOpenHelper
sqliteOpenHelper.getReadableDatabase()
后面两种都是实际上都是调用了第一种方法,只不过后面两种将路径限定为app的目录下。而SQLiteOpenHelper又对数据库的打开、关闭的一些条件判断进行了封装,并提供了数据库升级和降级的方法。因此第三种应是我们操作数据库的首选。
使用SQLiteOpenHelper
新建一个类(MySQLiteHelper)继承自SQLiteOpenHelper
该类要求实现onCreate、onUpgrade,并重写构造函数。
public class ImageSQLiteHelper extends SQLiteOpenHelper {
public ImageSQLiteHelper(Context context) {
// 以下为super中4个参数的说明
// Context
// name:数据库
// cursorFactory: 先传个null
// version 数据库版本,判断升级使用
super(context, "image.db", null, 1);
}
/**
* 一般在这里创建所需要的表
*/
@Override
public void onCreate(SQLiteDatabase db) {
String createSql = "create table image (_id Integer primary key, path varchar(20), md5 char(32))";
db.execSQL(createSql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (oldVersion < newVersion) {
switch (oldVersion) {
//不要加break,这样的会执行对应case以下完全部代码,更新至最新版本
case 1://TODO
case 2://TODO
case 3://TODO
}
}
}
}
这样通过
new ImageSQLiteHelper(context).getReadableDatabase()
便可以拿到数据库对象了。
数据库的增删改查
- execSQL
获取的数据库对象可以通过execSQL(sql语句)来执行一条我们拼接好的sql,但该sql不能是查询或者是返回数据的语句,这个语句的返回是void。也就是说这个方法可以执行增删改操作 - insert
eg:/** * @param table 表名 * @param nullColumnHack 传null * @param values 要插入的字段和值 */ public long insert(String table, String nullColumnHack, ContentValues values)
ContentValues contentValues = new ContentValues(); contentValues.put("path", path); contentValues.put("md5", md5); database.insert("image", null, contentValues);
- delete
eg1:/** * @param table 表名 * @param whereClause 删除条件,可以包含占位符?(sql语句中where后面的内容) * @param whereArgs 替换whereClause中的占位符 */ public int delete(String table, String whereClause, String[] whereArgs)
eg2:/** * 删除t1表中的所有数据 */ delete("t1", null, null)
// 删除accounts表中name为"strongCat"并且type为"1"的数据 String name = "strongCat"; String type = "1" db.delete("accounts", "name=? AND type=?",new String[] {name, type});
- update
eg:/** * @param table 表名 * @param values 要更新的字段内容 * @param whereClause 删除条件,可以包含占位符?(sql语句中where后面的内容) * @whereArgs 替换whereClause中的占位符 */ public int update(String table, ContentValues values, String whereClause, String[] whereArgs)
// 将accounts表中_id为1的name更改为strongCat ContentValues values = new ContentValues(); values.put("name", "strongCat"); String accountId = "1" db.update("accounts", values, "_id=?", new String[]{ accountId });
- query和rawQuery
这两个是专门用来查询的方法,query最终调用的也是rawQuery,如果需要排序、分组等建议选用query,只有一个where判断的话rawQuery传参会更简单些。
query
eg:/** * @param distinct 查询结果去除重复 * @param table 表名 * @param columns 要返回的字段,为null时返回所有字段 * @param selection 查询条件,可以包含占位符?(sql语句中where后面的内容) * @param selectionArgs 替换selection中的占位符 * @param groupBy 分组,sql当中的groupBy * @param having 用来过滤由GROUP BY语句返回的数据,sql当中的having * @param orderBy 排序,sql当中的orderBy * @param limit 分页,sql当中的limit */ public Cursor query(boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)
rawQuerykey = 1 // 从sessions表中查询key=1的记录。返回key,class,model三个字段 query(true, "sessions", new String[]{"key", "class", "model", "time"}, "key=?", key, null, null, null, null);
eg:/** * @param sql sql语句,变量用?占位 * @param selectionArgs 替换sql中的占位符 */ public Cursor rawQuery(String sql, String[] selectionArgs)
SESSION_TABLE = "session" // 查询session中的所有数据 rawQuery("select * from ?;", new String[]{SESSION_TABLE});