前几天学习这个地方的时候,卡了很久。一个是因为小米手机将sql数据库优化了,无法执行adb操作进行查询数据库。可以修复,但是很麻烦,弄了很久也没弄好。
跳过这一章之后,学习contentprovider也没弄好,因为很多例子都是用的sqlite数据库的东西。
所以,学习了几天service,其实也相当于复习。后来安装了genymotion模拟器,运行起来十分流畅,也是安卓原生态,所以将那一章的内容就好好学习了一遍。
P243
下面数据库学习实践项目的总结
1 使用事务
事务的特性就是两个事件,要么都完成,要么都不完成。适用于转账这个场景,转账成功,自己的账户扣除,同时对方的账户增加金额
两个事情,都必须完成,只完成一件事情,则会出现错误。此时,事务的机制就很好,要么都完成,要么都不成功。
数据库更新数据也一样,删除老数据,写入新数据。如果仅仅删除了老数据,没有写入新数据,必然产生错误。
delete()方法,和insert()方法。
增加一个按键,进行数据替换操作
在内部添加对应的逻辑,
SQLiteDatabase db=dbHelper.getWaritableDatabase();
db.beginTransaction();
try{
db.delete("book",null,null)
if(true) throw new NullPointerException();
ContentValues values=new ContentValues();
values.put("name","game of thrones");
values.put("author","George Martin");
values.put("pages",720);
values.put("price",20.85);
db.insert("book",null,values);
db.setTransactionSuccessful();
}
catch(Exception e){
e.printStackTrace();
}
finally{
db.endTransaction();
}
首先启动了事务,然后执行delete,此时手动抛出一个异常,然后续代码无法执行,则最后delete是不成功的
讲这个手动抛出动作注释掉,事务执行才完整,有一个setTransactionSuccessful才会执行
2升级数据库
运用
SQLiteOpenHelper中的upgrade方法
在里面添加逻辑
switch(oldversion){
case 1: db.execSQL(CREATE_CATEGORY);
case 2:db.execSQL(ADD_CATEGORYID);
}
在main中实例化这个db的时候dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 1);
最后那个是新的版本号,如果当前的版本号小于传入的版本号,就会执行upgrade函数
里面根据老版本号,进行对应的操作。
不加break是为了能够从任一版本升级至新版本。
以上均在虚拟机中跑的,效果都没什么问题。