sqlite優化和坑

2021-08-18 23:14:57 字數 1434 閱讀 4288

一:select 1和select 0進行優化

當我們只關心資料表有多少記錄行而不需要知道具體的字段值時,類似「select 1 from tblname」是乙個很不錯的sql語句寫法,它通常用於子查詢。

這樣可以減少系統開銷,提高執行效率,因為這樣子寫的sql語句,資料庫引擎就不會去檢索資料表裡一條條具體的記錄和每條記錄裡乙個個具體的字段值並將它們放到記憶體裡,而是根據查詢到有多少行存在就輸出多少個「1」,每個「1」代表有1行記錄,同時選用數字1還因為它所占用的記憶體空間最小,當然用數字0的效果也一樣。在不需要知道具體的記錄值是什麼的情況下這種寫法無疑更加可取。

1)列出每個班的學生人數

常規寫法

select class,count (*) as pax from students group by class;

更優寫法

select class,count (1) as pax from students group by class;

2)列出每個班最年輕的學生資料

常規寫法

select a.* from students a where not exists(select b.sid from students b where b.sid=a.sid and b.date_birth>a.date_birth);

更優寫法

select a.* from students a where not exists(select 1 from students b where b.sid=a.sid and b.date_birth>a.date_birth);

exists在sqlite中無法使用

二:坑方法:

execsql(string sql)方法無法寫入特殊字元,如:',

sqlitedatabase mdb = this.getdatabase();  

string insertstr = "insert into mtable(id,name,age,phone) values(1,'iocean's','80','110')";  

mdb.execsql(insertstr);  

替代方法:

sqlitedatabase mdb = this.getdatabase();  

string insertstr = "insert into mtable(id,name,age,phone) values(?,?,?,?)";  

object mvalue = new object{1,"iocean's","80","110");  

mdb.execsql(insertstr, mvalue);  

execsql和rawquery區別:execsql()方法可以執行insert、delete、update和create table之類有更改行為的sql語句; rawquery()方法用於執行select語句。

Sqlite的幾個坑

如果使用 cursoradapter進行適配時,切記開啟的資料庫的表名的主鍵名稱前要加 如果工程中有兩個activity,如果要啟動其中乙個activity,需要在manifest.xml檔案中將intent filter加到該activity下面,如圖要啟動cursoradapteractivit...

SQLite效能優化

最近做了乙個專案,在系統啟動時會更新幾千條資料,剛開始就使用最簡單的寫法,直接的insert,delete,導致這個更新過程進行了300多秒,後來經查得知在處理大量資料的時候新增上事務管理,會大大的提高效能,隨後就查閱資料如何來新增事務管理。這ios的sqlite和android上面的語法真是相差很...

sqlite 效能優化

比如 空間釋放 磁碟同步 cache大小等。不要開啟。前文提高了,vacuum的效率非常低!pragma auto vacuum pragma auto vacuum 0 1 查詢或設定資料庫的auto vacuum標記。正常情況下,當提交乙個從資料庫中刪除資料的事務時,資料庫檔案不改變大小。未使用...