Sqlite介绍
SQLite 是一款内置到移动设备上的轻量型的数据库,是遵守 ACID(原子性、一致性、隔离性、持久性)的关联式数据库管理系统,多用于嵌入式系统中。
SQLite 数据库是无类型的,可以向一个 integer 的列中添加一个字符串,但它又支持常见的类型比如: NULL,VARCHAR, TEXT, INTEGER, BLOB, CLOB 等。
但有一种情况例外:定义为INTEGER PRIMARY KEY的字段只能存储64位整数, 当向这种字段保存除整数以外的数据时,将会产生错误。
Android 系统内置了 SQLite,并提供了一系列 API 方便对其进行操作
API
SQLiteOpenHelper
SQLiteOpenHelper 是 Android 对于数据库的操作做了一个封装类,在实际使用的时候,需要继承它写一个新的子类。以下为重点方法介绍。
构造函数
传入数据库名称、版本号,在每次修改数据库结构后需要更新版本号!
onCreate
这个方法只会在首次创建数据时触发,一般在这里放入表的创建sql语句
onUpgrade
在数据库版本号发生变化后会执行,在这里要写入旧数据库升级的逻辑
示例:
public class OrderDBHelper extends SQLiteOpenHelper{
private static final int DB_VERSION = 1;
private static final String DB_NAME = "myTest.db";
public static final String TABLE_NAME = "Orders";
public OrderDBHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
// create table Orders(Id integer primary key, CustomName text, OrderPrice integer, Country text);
String sql = "create table if not exists " + TABLE_NAME + " (Id integer primary key, CustomName text, OrderPrice integer, Country text)";
sqLiteDatabase.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
String sql = "DROP TABLE IF EXISTS " + TABLE_NAME;
sqLiteDatabase.execSQL(sql);
onCreate(sqLiteDatabase);
}
}
SQLiteDatabase
SQLiteDatabase 代表了数据库的实例对象,通过SQLiteOpenHelper 的实例对象获取。有getWritableDatabase getReadableDatabase两种获取方式,区别是假如磁盘满了,getWritableDatabase 就会失败,而如果是采用 getReadableDatabase 的方式,会返回一个只读的数据库对象。
数据库的操作一般包括 增、删、改、查以及事务。
原生方式
execSQL 用于原生sql的删除、修改、添加
db.execSQL("insert into person(name, age) values('炸死特', 4)");
db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"炸死特", 4});
db.execSQL("delete from t_user where c_age<?", new Object[] { 21 });
db.execSQL("update t_user set c_name=? where c_age=?", new Object[] { "lisi", 25 });
rawQuery 用于原生sql的查询
Cursor cursor = db.rawQuery(“select * from person”, null);
Cursor cursor = db.rawQuery("select * from person where name like ? and age=?", new String[]{"%炸死特%", "4"});
API
除了原生的方式之外,还提供了几种方便的调用方式
//删除
db.delete("person", "personid<?", new String[]{"2"});
//添加
ContentValues values = new ContentValues();
values.put("c_name", "王五" + new Random().nextInt(10));
values.put("c_age", new Random().nextInt(50));
values.put("c_phone", "5556");ContentValues values = new ContentValues();
values.put("c_name", "wangwu");
//修改
int update = database.update(TABLE_NAME, values, "c_age=?", new String[] { "28" });
//查询
Cursor cursor = database.query(TABLE_NAME,
new String[] {"uid", "c_name", "c_age", "c_phone" },
"c_age<?", new String[] { "130" }, null, null, "c_age desc");
事务
在 SQLiteDatabase 提供了对事务的支持,处于事务中的操作都是“临时性”的,只有事务提交了 才会将数据保存到数据库。
事务的使用不仅可以保证数据的一致性,也可以提高批处理时的执行效率。
SQLiteDatabase 提供的 beginTransaction()打开事务,endTransaction()结束事务。
注意:结束 事务并不代表事务提交,如果想让数据写入的数据库需要在结束事务前执行 setTransactionSuccessful()方法。这是事务提交的唯一方式。
//数据库的事务操作
SQLiteDatabase database = mOpenHelper.getReadableDatabase();
String sql = "update t_user set c_money=c_money-500 where c_name=?";
// 模拟转账
// 开启了事务,那么之后的操作都是在缓存中执行
database.beginTransaction();
database.execSQL(sql, new String[] { "wangwu" });
// 在事务中模拟一个异常的发生
int a = 1 / 0;
String sql2 = "update t_user set c_money=c_money+500 where c_name=?";
database.execSQL(sql2, new String[] { "lisi" });
// 只有执行该代码,才将缓存中的数据写到数据库中
database.setTransactionSuccessful();
database.endTransaction();
database.close();
工具
推荐使用 Sqlite Studio 免费、开源、好用
https://sqlitestudio.pl/index.rvt
参考
https://www.jianshu.com/p/f80f0fe088b9
http://www.jianshu.com/p/5c33be6ce89d
http://blog.csdn.net/jason0539/article/details/10248457