SQLiteDatabase是Android提供的用来管理Sqlite database的一种数据持久化解决方案。SQLiteDatabase提供了基本的增删改查方法,可以执行SQL命令,执行其他常见数据库管理任务的方法。
android提供SQLiteOpenHelper类,继承抽象类实现其必须实现的抽象方法。
1、SQLiteOpenHelper提供3个构造方法重写
public Db(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); } public Db(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version, @Nullable DatabaseErrorHandler errorHandler) { super(context, name, factory, version, errorHandler); } @RequiresApi(api = Build.VERSION_CODES.P) public Db(@Nullable Context context, @Nullable String name, int version, @NonNull SQLiteDatabase.OpenParams openParams) { super(context, name, version, openParams); }
常用4个参数:第一个Context 上下文this对象,第二个数据库名称,第三个允许查询返回一个自定义cursor,传入null,第四个数据版本主要结合 onUpgrade 进行数据库版本升级。
2、创建表
public void onCreate(SQLiteDatabase db)
3、数据库升级
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
下面举例了sqlite的基本使用,代码例子如下:
/** * 数据库操作 */public class Db extends SQLiteOpenHelper { private SQLiteDatabase currentDB = null; public Db(@Nullable Context context){ this(context,"testdata",null,1); } public Db(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); } public Db(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version, @Nullable DatabaseErrorHandler errorHandler) { super(context, name, factory, version, errorHandler); } @RequiresApi(api = Build.VERSION_CODES.P) public Db(@Nullable Context context, @Nullable String name, int version, @NonNull SQLiteDatabase.OpenParams openParams) { super(context, name, version, openParams); } //创建数据库 @Override public void onCreate(SQLiteDatabase db) { this.currentDB = db; String sql = "CREATE TABLE IF NOT EXISTS " + "student ( " + " id INTEGER PRIMARY KEY AUTOINCREMENT, " + "name TEXT," + "gender INTEGER, " + "number TEXT, " + "score INTEGER)"; db.execSQL(sql); } /** * 删除所有表 */ public synchronized void dropAllTables() { SQLiteDatabase db = this.getWritableDatabase(); if (db == null) return; Cursor cur = db.query("sqlite_master", new String[] { "name" }, "type='table'", null, null, null, null); while (cur.moveToNext()) { String name = cur.getString(0); if (name.equals("android_metadata")) continue; db.execSQL("DROP TABLE IF EXISTS " + name); } // db.close(); } /** * 删除单个表 * * @param tableName * @return */ public synchronized int dropTable(String tableName) { if (tableName != null) { SQLiteDatabase db = this.getWritableDatabase(); db.execSQL("DROP TABLE IF EXISTS " + tableName); db.close(); return 1; } return 0; } /** * 数据库版本更新 * @param db * @param oldVersion * @param newVersion */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { this.currentDB = db; if (oldVersion < newVersion) { dropAllTables();//删除之前的表 重新建表 onCreate(db); } } @Override public SQLiteDatabase getWritableDatabase() { // TODO Auto-generated method stub if (currentDB != null) { return currentDB; } return super.getWritableDatabase(); } /** * 数据的删除 */ public synchronized void delete(String tableName,String where ,String[] whereArgs) { try { SQLiteDatabase db = this.getWritableDatabase(); db.delete(tableName, where, whereArgs); db.close(); } catch (Exception ex) { } } public synchronized void delete2(String tableName, String where) { try { SQLiteDatabase db = this.getWritableDatabase(); db.delete(tableName, where,null); db.close(); } catch (Exception ex) { } } public void updateData(String sql) { SQLiteDatabase db = this.getWritableDatabase(); db.execSQL( sql ); } /** * 插入数据 * * @param t * @return */ public synchronized long insert(String tableName, Map map) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues contentValues = new ContentValues(); //contentValues.put("id",(int)map.get("id")); contentValues.put("name",(String)map.get("name")); contentValues.put("gender",(int)map.get("gender")); contentValues.put("number",(String)map.get("number")); contentValues.put("score",(int)map.get("score")); //db.insertWithOnConflict(tableName,null,contentValues,SQLiteDatabase.CONFLICT_IGNORE); long insertid = db.replace(tableName, null, contentValues); db.close(); return insertid; } /** * 查询 * 这里直接返回游标,如果想抽象公用,直接使用反射注解等方法解析 */ public synchronized Cursor query(String tableName,String where,String order,int start,int count ){ SQLiteDatabase db = this.getWritableDatabase(); Cursor cursor = db.query(tableName, null, where, new String[] {}, null, null, order,start+","+count); //cursor = db.rawQuery("select * from TableSong where Words=?",new String[]{"6"} ); return cursor; }}
使用方法如下:
Db db = new Db(this); //插入数据 Map map = new HashMap(); map.put("name","xiaobai"); map.put("gender",1); map.put("number","187677666"); map.put("score",90); long id = db.insert("student",map ); Log.e( "ProcessBar","id="+id);
我们插入一条数据,并打开数据库看是否成功。
数据库地址/data/data/包名/databases/*
从模拟器下载数据库,用sqlite studio 工具打开数据库:
修改数据库:
//修改数据 把id=1 的 name字段修改为 张三db.updateData("update student set name = \"张三\" where id = 1 ");
查询数据:
//查询 Cursor cursor = db.query("student",null,null,0,10); while (cursor != null && cursor.moveToNext()) { Log.e("ProcessBar","queryData student = " + cursor.getInt(cursor.getColumnIndex("id" ) ) +";"+cursor.getString(cursor.getColumnIndex("name" )) ); }
结果:
根据条件删除数据:
//方式一 //db.delete("student","name=?",new String[]{"xiaobai"}); //方式2 db.delete2("student","id=25");
SQLite事务
SQLite默认会为每个插入、更新操作创建一个事务,并且在每次插入、更新后立刻提交。如果连续插入n次数据,就会重复执行n次创建事务->执行语句->提交操作。如果主动创建事务,那么这个过成就被优化为创建事务->执行n条语句->提交操作,创建事务和提交操作只执行了一次,可以使性能大幅提高。数据库事务代码如下:
//事务开始 database.beginTransaction(); try { //执行操作语句 ... //事务成功 database.setTransactionSuccessful(); } catch (Exception e) { e.printStackTrace(); } finally { //事务结束 database.endTransaction(); }
重要说明:
SQLiteOpenHelper中有两个非常重要的实例方法,getReadableDatabase() 和getWritableDatabase()。这两个方法都可以创建或打开一个现有的数据库(如果数据库已存在则直接打开,否则创建一个新的数据库),并返回一个可对数据库进行读写操作的对象。不同的是,当数据库不可写入的时候(如磁盘空间已满)getReadableDatabase()方法返回的对象将以只读的方式去打开数据库,而getWritableDatabase()方法则将出现异常。