SQLite的使用
SQLite 是一款轻量级的关系型数据库,它的运算速度非常快,占用资源很少,通常只需要几百 K 的内存就足够了,因而特别适合在移动设备上使用。
1.1 创建数据库
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table book(name,author,price)");
}
DatabaseHelper databaseHelper = new DatabaseHelper(this,"BookStore.db",null,1);
mSQLiteDatabase = databaseHelper.getWritableDatabase();
1.2 升级数据库
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists Book");
db.execSQL("drop table if exists Category");
onCreate(db);
}
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table book(name,author,price)");
db.execSQL("create table Category(name,code)");
}
dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 2);
mSQLiteDatabase = databaseHelper.getWritableDatabase();
1.3 添加数据
这里要使用contentValues,它是一个键值对,对来承载数据的,添加数据如下:ContentValues contentValues = new ContentValues(); //创建contentValue
contentValues.put(DatabaseHelper.USERNAME,"Tom");
contentValues.put(DatabaseHelper.AGE,"123");
mSqLiteDatabase.insert(DatabaseHelper.DATABASE_NAME,null,contentValues); //插入第一条数据
contentValues.clear(); //清空contentValue数据,重新添加数据
contentValues.put(DatabaseHelper.USERNAME,"Jack");
contentValues.put(DatabaseHelper.AGE,"456");
mSqLiteDatabase.insert(DatabaseHelper.DATABASE_NAME,null,contentValues); //插入第二个数据
上面的代码中,首先创建一个contentValue,在里面放置要添加的数据,然后用insert()方法把contentValue添加到应对的表中。
1.4 更新数据
db.update("Book",contentValue,"name=?",new String[]{"The Dream of Red Mansion"});
上面第三个参数中“?”是一个占位符,第四个参数提供了占位符指定的相应内容,这里表示更新name=
The Dream of Red Mansion的行。
1.5 删除数据
db.delete("Book","price>?",new String[]{"500"});
1.6查询数据
数据库SQL的全称是Structured Query Language(结构化查询语言),所以查询功能是其核心。第一个参数不用说,当然还是表名,表示我们希望从哪张表中查询数据。第二个参数用于指定去查询哪几列,如果不指定则默认查询所有列。第三、第四个参数用于去约束查询某一行或某几行的数据,不指定则默认是查询所有行的数据。第五个参数用于指定需要去 group by 的列,不指定则表示不对查询结果进行 group by 操作。第六个参数用于对 group by 之后的数据进行进一步的过滤,不指定则表示不进行过滤。第七个参数用于指定查询结果的排序方式,不指定则表示使用默认的排序方式。
Cursor cursor = mSqLiteDatabase.query(DatabaseHelper.DATABASE_NAME,null,null,null,null,null,null);
if (cursor.moveToFirst()){
int count = cursor.getCount();
for (int i = 0; i < count; i++) {
String userName = cursor.getString(cursor.getColumnIndexOrThrow(DatabaseHelper.USERNAME));
String age = cursor.getString(cursor.getColumnIndexOrThrow(DatabaseHelper.AGE));
Log.i(MainActivity.class.getSimpleName(),i+":"+userName+"|"+age);
}
}
上面是最简单的一种查询功能,首先使用
query()方法表示希望查询这张表中的数据;接着调用moveToFirst()方法将数据的指针移动到第一行位置,然后进入一个循环,去遍历查询到的每一行数据。
1.7 使用SQL语言操作数据
前面讲的是利用Android中的DatabaseHelper提供的API对数据库进行操作,我们也可以直接使用SQL语言进行操作。例如删除数据的代码:
<pre name="code" class="java">db.execSQL("delete from Book where price>?",new String[]{"20"});
添加数据的代码:
db.execSQL("insert into Book (name, autho, price) values(?, ?, ?, ?)",new String[] { "The Da Vinci Code", "Dan Brown", "16.96" });
查询数据的代码:
db.rawQuery("select * from Book", null);
可以看到,查了查询数据的时候调用的是SQLiteDatabase的rawQuery()方法,其他的操作都是调用execSQL()方法。
1.8 使用事务
SQLite 数据库是支持事务的,事务的特性可以保证让某一系列的操作要么全部完成,要么一个都不会完成。那我们为什么要使用事务呢?
考虑这种情况,比如你正在进行一次转账操作,银行会将转账的金额先从你的账户扣除,然后再向收款方的账户添加等量的金额。可是,如果当你的账户中的金额刚刚被扣除,这时由于一些原因导致对方收款失败,那这一笔钱就凭空消失了。这时我们可以使用事务这种技术,保证扣钱和收款要么一起成功,要么一起失败。
<span style="white-space:pre"> </span>mSqLiteDatabase.beginTransaction(); //开启事务
try {
mSqLiteDatabase.delete(DatabaseHelper.DATABASE_NAME,null,null);
if (true){
//这里手动抛出一个异常,让事务失败
throw new NullPointerException();
}
ContentValues contentValues = new ContentValues();
contentValues.put(DatabaseHelper.USERNAME,"Frank");
contentValues.put(DatabaseHelper.AGE,"10岁");
mSqLiteDatabase.insert(DatabaseHelper.DATABASE_NAME,null,contentValues); //删除操作和添加操作同时成功或失败
mSqLiteDatabase.setTransactionSuccessful(); // 事务已经执行成功
}catch (Exception e){
e.printStackTrace();
}finally {
mSqLiteDatabase.endTransaction(); //结束事务
}
总结:对于三种数据持久化的方法,文件适用于存储一些简单的文本数据或者二进制数据,SharePreferences适用于存储一些键值对,而数据库适合存储那些复杂的关系型数据。
拾遗:
1、快捷键Ctrl+Shift+A弹出对话框中可以输入要执行的操作的名字,可快速执行操作;
2、用上述快捷键输入ADB Clear清除这个工程在手机中的数据,和安卓系统中setting工具的清除工具是一样的效果;
3、原始的SQL语句执行效率更高,如rawQuery、execSQL语句;