sqlite是我在客戶端上使用得最多的資料庫,方便易用穩定強大,其支援很多的平台和語言:我分別在windows (
c++、
qt)、android、ios上開發過使用
sqlite來儲存客戶端本地資料的應用。下面說說對使用sqlite的一些心得。
1、批量插入。很多人發現使用sqlite插入大量資料的時候非常慢。我有印象剛使用sqlite的時候發現插入2000條資料(10列左右)居然要好幾分鐘,速度慢得令人髮指。但後來發現如果是正確使用sqlite,一般這是在小幾百毫秒就能完成的工作。要點:
a)務必要使用事務。這點可以數量級地提高批量插入的速度。
b)使用
statement並用好,具體地說是: prepare(此步奏只執行一次) -> (開始處理第一條記錄) -> bind(填充第一列) -> bind(填充第二列……)
-> execute(執行插入) -> clearbind(別忘了清除填充的資料) ->
(開始處理第二條記錄)
-> bind(填充第一列) -> bind (填充第二列……)-> execute -> clearbind(清除填充的資料) -> (處理第三條記錄……)。statement的prepare也是乙個比較耗時的操作,在批量插入的時候沒必要每次都去呼叫。這點對效能的提公升沒有使用事務來得明顯,但一般也能提公升幾倍的效能。
《android批量插入**示例》
《ios批量插入**示例》
2、資料庫公升級機制。產品週期較長的軟體開發過程中,難免要對資料庫的表結構進行修改,比如增加表、字段、索引。一開始我是通過表名來進行區分,比如使用者表是t_user,如果表結構需要修改就建立一張新錶t_user_v2。在資料庫開啟的時候,檢查各表是否存在,如果不存在則建立。後面開發安卓應用,發現google的解決方法優雅多了:其可以為資料庫定義乙個版本號(舉個栗子——19),之後如果資料庫表結構需要修改,則增加這個版本號(
舉個栗子——增加到20)。然後在開啟資料庫的時候會自動觸發
void onupgrade(sqlitedatabase db, int oldversion[=19], int newversion[=20] ) 函式,該函式有之前的版本號和目前的版本號,然後就可以執行相應的資料庫公升級指令碼了。
或者用sharedpreference、文字檔案也是可以的。)。下次開啟資料庫的時候,對比儲存的版本和當前的資料庫版本。如果當前的資料庫版本更高,則呼叫資料庫公升級函式進行公升級(記得之後更新版本記錄為新的版本號)。我在ios上就是使用這種方式來進行資料庫公升級的。
3、資料庫劃分。建議:如果沒有事務、外來鍵等需要,盡量把不同用途的表劃分在多個資料庫檔案中,而不是使用單一的資料庫檔案。這麼做最主要優點是有利於模組劃分,避免其他所有模組都要訪問同乙個巨大務必的資料庫模組。另外效能也會更好,比如sqlite並不支援多執行緒讀寫,所以訪問同乙個資料庫的時候是要加同步鎖的。使用多個資料庫可以降低鎖等待的可能。
4、理解rowid。
rowid是sqlite比較有特色的功能。rowid是sqlite為每條記錄儲存的乙個隱藏列(select * from table 檢視不了,需要的 select rowid,* from table),rowid從1開始遞增。如果拿rowid作為外來鍵來使用的時候,需要注意的一點是:「insert or replace into" 是會改變rowid的值。所以如果想更新記錄,應該使用update語句,如果想忽略新值,應該用"insert or ignore into"語句。
最後但很重要的是:掌握sql的基本知識。
SQLite批量插入和其他一些使用心得
sqlite是我在客戶端上使用得最多的資料庫,方便易用穩定強大,其支援很多的平台和語言 我分別在windows c qt android ios上開發過使用 sqlite來儲存客戶端本地資料的應用。下面說說對使用sqlite的一些心得。1 批量插入。很多人發現使用sqlite插入大量資料的時候非常慢...
一些SQLite技巧
sqlite自增id自段 使用方法為integer primary key autoincrement 如 create table 21andy id integer primary key autoincrement,21andy varchar 100 not null,date date 注...
一些SQLite技巧
sqlite自增id自段 使用方法為integer primary key autoincrement 如 create table 21andy id integer primary key autoincrement,21andy varchar 100 notnull,date date 注意...