query() 做的一件事就是帮你拼写 SQL 语句,
而调用 rawQuery() 是你自己拼写好语句。我认为的差别仅次而已。
Cursor c = db.rawQuery("SELECT * FROM table WHERE android123=?", args); 执行本地SQL语句查询
Cursor c= db.query("***", new String[]{"name"}, "id=?", new String[]{"1"}, null, null, null);
Cursor c = db.rawQuery("select * from person where name like ? and age=?", new String[]{"%林计钦%", "4"});
Cursor c = db.query("person", new String[]{"personid,name,age"}, "name like ?", new String[]{"%ljq%"}, null, null, "personid desc", "1,2");
db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"林计钦", 4});
desc降序
asc 升序
db.delete("person", "personid<?", new String[]{"2"}); 从person表中删除personid小于2的记录。
SQLiteDatabase db = ....;
db.beginTransaction();//开始事务
try {
db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"林计钦", 4});
db.execSQL("update person set name=? where personid=?", new Object[]{"abc", 1});
db.setTransactionSuccessful();//调用此方法会在执行到endTransaction() 时提交当前事务,如果不调用此方法会回滚事务
} finally {
db.endTransaction();//由事务的标志决定是提交事务,还是回滚事务
}
db.close();
相应地ContentObserver也分为“表“ContentObserver、“行”ContentObserver,
当然这是与它所监听的Uri MIME Type有关的。
notifyForDescendents 为false 表示精确匹配,即只匹配该Uri
为true 表示可以同时匹配其派生的Uri
// 通过调用getUriFor 方法获得 system表里的"飞行模式"所在行的Uri
Uri airplaneUri = Settings.System.getUriFor(Settings.System.AIRPLANE_MODE_ON);
// 注册内容观察者
getContentResolver().registerContentObserver(airplaneUri, false, airplaneCO);
// ”表“内容观察者 ,通过测试我发现只能监听此Uri -----> content://sms
// 监听不到其他的Uri 比如说 content://sms/outbox
Uri smsUri = Uri.parse("content://sms");
getContentResolver().registerContentObserver(smsUri, true,smsContentObserver);
事務處理: 是為了保証數據的準確性. 在處理過程式, 如果出錯或者因條件不滿足,
那么可乆將前面已操作的數據回復, 不做變化. 如果在一段程式, 要做相當多的變化, 一定要用事務處理
事务处理有开始,结束,回滚三种。
如:向一个主表和子表插入数据时。
如果顺利不出错在insert(主)前开始事务,在insert(子)后
结束事务。出错的话他就会回滚到insert前的状态。
如正常的写法:
{
开始事务
执行操作
。。。。
结束事务
回滚事务
执行提示等一些信息
。。。
}