sqlite如何插入二進(jìn)制數(shù)據(jù)

Prepared Statement Object

typedef struct sqlite3_stmt sqlite3_stmt;

The life-cycle of a prepared statement object usually goes like this:

1.Create the prepared statement object using sqlite3_prepare_v2().
2.Bind values to parameters using the sqlite3_bind_*() interfaces.
3.Run the SQL by calling sqlite3_step() one or more times.
4.Reset the prepared statement using sqlite3_reset() then go back to step 2. Do this zero or more times.
5.Destroy the object using sqlite3_finalize().

sqlite 操作二進(jìn)制數(shù)據(jù)需要用一個(gè)輔助的數(shù)據(jù)類(lèi)型:sqlite3_stmt * 。
這個(gè)數(shù)據(jù)類(lèi)型記錄了一個(gè)“sql語(yǔ)句”。為什么我把 “sql語(yǔ)句” 用雙引號(hào)引起來(lái)?因?yàn)槟憧梢园?sqlite3_stmt * 所表示的內(nèi)容看成是 sql語(yǔ)句,但是實(shí)際上它不是我們所熟知的sql語(yǔ)句。它是一個(gè)已經(jīng)把sql語(yǔ)句解析了的、用sqlite自己標(biāo)記記錄的內(nèi)部數(shù)據(jù)結(jié)構(gòu)。
正因?yàn)檫@個(gè)結(jié)構(gòu)已經(jīng)被解析了,所以你可以往這個(gè)語(yǔ)句里插入二進(jìn)制數(shù)據(jù)。當(dāng)然,把二進(jìn)制數(shù)據(jù)插到 sqlite3_stmt 結(jié)構(gòu)里可不能直接 memcpy ,也不能像 std::string 那樣用 + 號(hào)。必須用 sqlite 提供的函數(shù)來(lái)插入。

首先聲明 sqlite3_stmt * stat;

然后,把一個(gè) sql 語(yǔ)句解析到 stat 結(jié)構(gòu)里去:
sqlite3_prepare( db, “insert into Tbl_2( ID, file_content) values( 10, ? )”, -1, &stat, 0 );

上面的函數(shù)完成 sql 語(yǔ)句的解析。

第一個(gè)參數(shù)跟前面一樣,是個(gè) sqlite3 * 類(lèi)型變量,
第二個(gè)參數(shù)是一個(gè) sql 語(yǔ)句。這個(gè) sql 語(yǔ)句特別之處在于 values 里面有個(gè) ? 號(hào)。在sqlite3_prepare函數(shù)里,?號(hào)表示一個(gè)未定的值,它的值等下才插入。
第三個(gè)參數(shù)我寫(xiě)的是-1,這個(gè)參數(shù)含義是前面 sql 語(yǔ)句的長(zhǎng)度。如果小于0,sqlite會(huì)自動(dòng)計(jì)算它的長(zhǎng)度(把sql語(yǔ)句當(dāng)成以/0結(jié)尾的字符串)。
第四個(gè)參數(shù)是 sqlite3_stmt 的指針的指針。解析以后的sql語(yǔ)句就放在這個(gè)結(jié)構(gòu)里。
第五個(gè)參數(shù)我也不知道是干什么的。為0就可以了。
如果這個(gè)函數(shù)執(zhí)行成功(返回值是 SQLITE_OK 且 stat 不為NULL ),那么下面就可以開(kāi)始插入二進(jìn)制數(shù)據(jù)。

sqlite3_bind_blob( stat, 1, pdata, (int)(length_of_data_in_bytes), NULL );

// pdata為數(shù)據(jù)緩沖區(qū),length_of_data_in_bytes為數(shù)據(jù)大小,以字節(jié)為單位
這個(gè)函數(shù)一共有5個(gè)參數(shù)。

第1個(gè)參數(shù):是前面prepare得到的 sqlite3_stmt * 類(lèi)型變量。
第2個(gè)參數(shù):?號(hào)的索引。前面prepare的sql語(yǔ)句里有一個(gè)?號(hào),假如有多個(gè)?號(hào)怎么插入?方法就是改變 bind_blob 函數(shù)第2個(gè)參數(shù)。這個(gè)參數(shù)我寫(xiě)1,表示這里插入的值要替換 stat 的第一個(gè)?號(hào)(這里的索引從1開(kāi)始計(jì)數(shù),而非從0開(kāi)始)。如果你有多個(gè)?號(hào),就寫(xiě)多個(gè) bind_blob 語(yǔ)句,并改變它們的第2個(gè)參數(shù)就替換到不同的?號(hào)。如果有?號(hào)沒(méi)有替換,sqlite為它取值null。
第3個(gè)參數(shù):二進(jìn)制數(shù)據(jù)起始指針。
第4個(gè)參數(shù):二進(jìn)制數(shù)據(jù)的長(zhǎng)度,以字節(jié)為單位。
第5個(gè)參數(shù):是個(gè)析夠回調(diào)函數(shù),告訴sqlite當(dāng)把數(shù)據(jù)處理完后調(diào)用此函數(shù)來(lái)析夠你的數(shù)據(jù)。這個(gè)參數(shù)我還沒(méi)有使用過(guò),因此理解也不深刻。但是一般都填NULL,需要釋放的內(nèi)存自己用代碼來(lái)釋放。

bind完了之后,二進(jìn)制數(shù)據(jù)就進(jìn)入了你的“sql語(yǔ)句”里了。

你現(xiàn)在可以把它保存到數(shù)據(jù)庫(kù)里:
int result = sqlite3_step( stat );
通過(guò)這個(gè)語(yǔ)句,stat 表示的sql語(yǔ)句就被寫(xiě)到了數(shù)據(jù)庫(kù)里。
最后,要把 sqlite3_stmt 結(jié)構(gòu)給釋放:
sqlite3_finalize( stat ); //把剛才分配的內(nèi)容析構(gòu)掉

轉(zhuǎn)載地址:
http://www.jb51.net/article/53945.htm

http://www.sqlite.org/c3ref/stmt.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容