【資料庫】SQLITE3 使用總結4

來源:互聯網
上載者:User
(2) 操作二進位sqlite 操作位元據需要用一個輔助的資料類型:sqlite3_stmt * 。
- J: d$ s+ |$ N/ W7 D& M
2 c3 x$ x% s) Z" n; ~! x- ^' x這個資料類型 記錄了一個“sql語句”。為什麼我把 “sql語句” 用雙引號引起來?因為你可以把 sqlite3_stmt * 所表示的內容看成是 sql語句,但是實際上它不是我們所熟知的sql語句。它是一個已經把sql語句解析了的、用sqlite自已標幟記錄的內部資料結構。
3 f, D7 L$ M4 t7 v
. X0 i7 A6 U" y- ?) k/ \' n正因為這個結構已經被解析了,所以你可以往這個語句裡插入位元據。當然,把位元據插到 sqlite3_stmt 結構裡可不能直接 memcpy ,也不能像 std::string 那樣用 + 號。必須用 sqlite 提供的函數來插入。8 E( q3 j! b% J   F
1 o1 g: V& O& b8 S% _   s. H- `
: y' z5 y& S; H! W

( X7 _& g( i, s* H7 ni.1       寫入二進位
2 Q; r! j2 k1 @
6 B5 m% P4 i0 y; }( |下面說寫二進位的步驟。' l5 d$ V/ z' h' e: W
+ n' a' R9 E* T3 i$ ?0 P' |   ]
要插入二進位,前提是這個表的欄位的類型是 blob 類型。我假設有這麼一張表:

複製內容到剪貼簿

代碼:

create table Tbl_2( ID integer, file_content   blob )

首先聲明
: B- s, C6 C, c9 N# [2 M. s! [( n; @1 v
sqlite3_stmt * stat;
* b, Q+ y; b- S! C& I   d" B- u7 Z# H# B   H% p0 @6 E2 V; b
然後,把一個 sql 語句解析到 stat 結構裡去:

複製內容到剪貼簿

代碼:

sqlite3_prepare( db, “insert into Tbl_2( ID, file_content) values( 10, ? )”, -1, &stat, 0 );

上面的函數完成 sql 語句的解析。第一個參數跟前面一樣,是個 sqlite3 * 類型變數,第二個參數是一個 sql 語句。
# D- l/ Y$ l& Q( O7 g( v
6 V* L# ~2 P5 o9 H這個 sql 語句特別之處在於 values 裡面有個 ? 號。在sqlite3_prepare函數裡,?號表示一個未定的值,它的值等下才插入。
% I2 W. d1 h. ]
2 _" Y+ z) V2 B第三個參數我寫的是-1,這個參數含義是前面 sql 語句的長度。如果小於0,sqlite會自動計算它的長度(把sql語句當成以\0結尾的字串)。8 w# |5 u0 ~8 }. z' e, a
* U/ F5 C" V: l7 X4 N. }2 H3 K
第四個參數是 sqlite3_stmt 的指標的指標。解析以後的sql語句就放在這個結構裡。+ f6 n! b; d& ?, n
- {# e* E: o7 f# t
第五個參數我也不知道是幹什麼的。為0就可以了。
- m. E% q1 `' Y/ ^# d( k
) `" |( o8 @" c$ c4 o% Y' H+ L5 I   P如果這個函數執行成功(傳回值是 SQLITE_OK 且 stat 不為NULL ),那麼下面就可以開始插入位元據。

複製內容到剪貼簿

代碼:

sqlite3_bind_blob( stat, 1, pdata, (int)(length_of_data_in_bytes), NULL ); // pdata為資料緩衝區,length_of_data_in_bytes為資料大小,以位元組為單位

這個函數一共有5個參數。
- `( u& r- T* c, c3 B$ Z
, H7 c. Q* ~. ^$ T* c第1個參數:是前面prepare得到的 sqlite3_stmt * 類型變數。
/ C( {. Y( @   m# }( W" D+ Y6 u, Y
! w9 J% U6 f" f/ t第2個參數:?號的索引。前面 prepare的sql語句裡有一個?號,假如有多個?號怎麼插入?方法就是改變 bind_blob 函數第2個參數。這個參數我寫1,表示這裡插入的值要替換 stat 的第一個?號(這裡的索引從1開始計數,而非從0開始)。如果你有多個?號,就寫多個 bind_blob 語句,並改變它們的第2個參數就替換到不同的?號。如果有?號沒有替換,sqlite為它取值null。4 |+ q5 l) K, a; _

2 J   I8 T2 X0 P- W$ ]7 R" B第3個參數:位元據起始指標。" W, n4 I: Q, L; H$ o, ^; X2 ^
5 W* I* ^6 i4 Z   p7 }
第4個參數:位元據的長度,以位元組為單位。
2 \6 D! c; c, u   d; i   @: S0 c+ F& y6 }' f0 V0 G5 k/ H
第5個參數:是個析夠回呼函數,告訴sqlite當把資料處理完後調用此函數來析夠你的資料。這個參數我還沒有使用過,因此理解也不深刻。但是一般都填NULL,需要釋放的記憶體自己用代碼來釋放。
. P( `2 \! m2 F; N3 R- G; @2 G! y. [
. A! E- `- v3 p9 {bind完了之後,位元據就進入了你的“sql語句”裡了。你現在可以把它儲存到資料庫裡:

複製內容到剪貼簿

代碼:

int result = sqlite3_step( stat );

通過這個語句,stat 表示的sql語句就被寫到了資料庫裡。
/ q: c/ [6 i! l5 s" n0 x. u' A. Z" @3 u0 x* h2 R: s+ E3 a
最後,要把 sqlite3_stmt 結構給釋放:

複製內容到剪貼簿

代碼:

sqlite3_finalize( stat ); //把剛才分配的內容析構掉

i.2       讀出二進位& Q+ {% F9 I8 J8 N+ S   g4 l: s. Q

( ?% u! E8 z* P" w/ m( v6 A下面說讀二進位的步驟。
/ @9 n- V7 Y' |0 I4 c, I8 [5 }: d5 O
跟前面一樣,先聲明 sqlite3_stmt * 類型變數:

複製內容到剪貼簿

代碼:

sqlite3_stmt * stat;

然後,把一個 sql 語句解析到 stat 結構裡去:

複製內容到剪貼簿

代碼:

sqlite3_prepare( db, “select * from Tbl_2”, -1, &stat, 0 );

當 prepare 成功之後(傳回值是 SQLITE_OK ),開始查詢資料。

複製內容到剪貼簿

代碼:

int result = sqlite3_step( stat );

這一句的傳回值是 SQLITE_ROW 時表示成功(不是 SQLITE_OK )。
1 l0 I0 t5 c# P$ |, s# R1 \" `
$ ]. D1 \+ `+ f& {你可以迴圈執行 sqlite3_step 函數,一次 step 查詢出一條記錄。直到傳回值不為 SQLITE_ROW 時表示查詢結束。
1 M7 O) g, N+ m- J* n
. g7 H" T0 |; [4 ]然後開始擷取第一個欄位:ID 的值。ID是個整數,用下面這個語句擷取它的值:

複製內容到剪貼簿

代碼:

int id = sqlite3_column_int( stat, 0 ); //第2個參數表示擷取第幾個欄位內容,從0開始計算,因為我的表的ID欄位是第一個欄位,因此這裡我填0

下面開始擷取 file_content 的值,因為 file_content 是二進位,因此我需要得到它的指標,還有它的長度:

複製內容到剪貼簿

代碼:

      const void * pFileContent = sqlite3_column_blob( stat, 1 );

      int len = sqlite3_column_bytes( stat, 1 );

這樣就得到了二進位的值。& ?6 ^, }3 P2 H# o4 [! M5 A2 X

& Y4 g" E9 r$ ^6 k, K, X把 pFileContent 的內容儲存出來之後,不要忘了釋放 sqlite3_stmt 結構:

複製內容到剪貼簿

代碼:

sqlite3_finalize( stat ); //把剛才分配的內容析構掉

i.3       重複使用 sqlite3_stmt 結構
; X) `1 M/ d: T
$ d3 ?% `7 h# b/ N如果你需要重複使用 sqlite3_prepare 解析好的 sqlite3_stmt 結構,需要用函數: sqlite3_reset。

複製內容到剪貼簿

代碼:

result = sqlite3_reset(stat);

這樣, stat 結構又成為 sqlite3_prepare 完成時的狀態,你可以重新為它 bind 內容。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.