SQLite資料庫如何儲存和讀取二進位制資料

2021-04-24 19:18:13 字數 2378 閱讀 4977

1.

儲存二進位制資料

sqlite

提供的繫結二進位制引數介面函式為:

int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));

我們希望使用的是一套經過封裝的

com介面,將上面這個函式封裝為

com介面的形式

bindparabyindex( long index, variant val); 使用

variant

變數來傳遞二進位制資料,可以使用到它的乙個

safearray

指標,它儲存了二進位制資料的位址和二進位制資料的位元組長度。

在我們的

com介面中可以這樣進行呼叫原始介面:

sqlite3_bind_blob(m_pstmt, val.parray, val.parray->rsground->celement,sqlite_transient);

構造乙個例子測試我們的介面:

byte

data = ;

ccomsafearray

*pcsfa;

ccomsafearraybound

bound[1];

bound[0].setcount(5);

bound[0].setlowerbound(0);

pcsfa = new

ccomsafearray

(bound,1);

for(long

i = 0; i

<(long)5; i++)

_variant_t

variant;

variant.vt = vt_array | vt_ui1;

variant.parray = pcsfa->m_psa;

將五個位元組的資料封裝到variant變數中,然後呼叫相應的介面,將它們儲存到資料庫中,然後

呼叫下面的讀取二進位制介面,將資料讀取出來,看是否讀取的資料和儲存的資料一致. 2.

讀取二進位制資料

讀取二進位制引數需要用到下面兩個

sqlite

提供的api

:const void *sqlite3_column_blob(sqlite3_stmt*, int icol);

int sqlite3_column_bytes(sqlite3_stmt*, int icol);

訪問也通過com介面來實現:

getblobdata(long index, variant* pval);

如何將原始介面讀出來的資料封裝到variant結構中去呢,網上這方面的參考資料好少,差了不少資料,發現網上有不上safearray的實現方案,但是我一一試了一下沒有乙個可以將二進位制數讀入safearray結構的,mentor給我推薦了乙個ccomsafearray類,這個類成功實現了資料的儲存。

ccomvariant

cval;

intnlen = sqlite3_column_bytes(m_pstmt,nindex);

const

void* pcvdata = (const

void*)sqlite3_column_blob(m_pstmt,nindex);

byte

* pdata = new

byte[nlen];

memcpy

(pdata,pcvdata,nlen);

ccomsafearray

*pcsfa;

ccomsafearraybound

bound[1];

bound

[0].setcount(nlen);

bound

[0].setlowerbound(0);

pcsfa

= new

ccomsafearray

(bound,1);

for(long

i = 0; i

<(long)nlen; i++)

cval

= pcsfa->m_psa;

cval

.vt = vt_array | vt_ui1;

delete

pdata;

cval.detach(pval);

ok,現在可以通過下面的**來測試是否成功讀取了所有的二進位制資料。測試**如下:

_variant_t val;

val = getblobdata(nindex); //nindex

表示blob型別資料的索引值

byte

buf[5];

if(val.vt == (vt_ui1|vt_array))

}for

(int

j = 0; j

< 5; j++)

SQLite資料庫儲存

建立資料庫 建立資料庫,首先我們需要建立乙個幫助類繼承sqliteopenhelper類,sqliteopenhelper類是乙個抽象類,其中有兩個抽象方法,oncreate upgrade 我們應該在自己的抽象類裡面實現這兩個抽象方法,並在其中事項建立資料庫和公升級資料庫的邏輯。sqliteope...

Sqlite資料庫儲存和Android單元測試

1.路徑 data data packagename database db 2.特點 儲存有一定關係結構的資料 應用解除安裝時自動刪除 3.sqlite的特點 小 快 4.相關api 1 sqliteopenhelper 資料庫操作的抽象幫助類 sqliteopenhelper context c...

SQLite儲存 建立資料庫

從昨天晚上六點到今天早上八點全班同學一直都在別墅趴 玩得好開心 此乃本人的學習筆記 我只是將csdn部落格做為乙個記錄學習的地方 so.1.自己重寫乙個類繼承至sqliteopenhelper 2.用繼承的類建立乙個物件 3.使用此物件呼叫getwritabledatabase 或getreadab...