Berkeley DB使用全解

2021-04-13 09:17:50 字數 3080 閱讀 2571

在開發桌面級應用程式時,常常需要用到可持續儲存技術,做為儲存程式在退出之前所使用的資料,如變數,物件,視窗位置,大小.一般我們會使用office access這類桌面型檔案資料庫,或者是使用登錄檔.但是它們都有一些不盡人意的缺陷.比如:

1.mdb檔案無法在沒有安裝office的系統上訪問,直少得需要為它單獨安裝乙個元件

2.它與登錄檔沒法實現c++結構儲存,(但是可以使用復合文件的技術來實現,以後再講)

由於以上等原因,所以我們需要選擇一款,適合桌面級的檔案資料庫.

版本:berkeley db 4.6.18

注意,它有c和c++兩個版本,都是跨本台的,這裡我們主要介紹c++的

建立資料庫:

#define database 「mydatabase.db」 //資料庫檔案

dbdb(null,0); if

(ret = db.open(null,database,null,db_btree,db_create,0))

db.close(0);//

關閉資料庫

插入一條記錄:

注意,到目前為止,我發現它只能做到乙個關鍵字對應乙個值.

這裡使用乙個c++結構做為例子,稍複雜點 //

這裡建立key //

它可以是任何一型別資料,berkeleydb是以記憶體內容比較的,所以它也可以是個結構,當然你//不怕麻煩

dbtkey; 

key.set_data((void *)&index);

key.set_size(4);

也可以

dbt key(

「mykey

」,6); //

多留個/0 //

建立乙個結構體並賦值,裡面就是我們要存放的value

typedef

struct

foo,*pfoo;

dbtdata; //

保證每個欄位都準確的寫入這個緩衝,因為你寫進去什麼樣,讀出來就是什麼樣

foofoo = ;

size_t

len = 4+4+strlen(foo._username)+4+strlen(foo._password);

char *buf = new

char[len];

memset(buf,0,len);

intslen = 0;

memcpy(buf,(char*)&foo._id,sizeof(int));

slen += sizeof(int);

intnamelen = strlen(foo._username);

intpasslen = strlen(foo._password);

memcpy(buf+slen,(void*)&namelen,sizeof(int));

slen += sizeof(int);

memcpy(buf+slen,foo._username,namelen);

slen += namelen;

memcpy(buf+slen,(void*)&passlen,sizeof(int));

slen += sizeof(int);

memcpy(buf+slen,foo._password,passlen);

slen += passlen;

data.set_data((void *)buf); //

寫入dbt

data.set_size(slen);         //

設定大小,很關鍵,別算錯了 //

寫入資料庫

if ((ret = db.put( null, &key, &data, 0)) == 0)  

printf("db: %s: key stored./n", (char *)key.get_data());

else

db.err( ret, "db->put");   //

出錯,列印相當錯誤資訊

從資料庫裡讀出記錄: 1.

查詢乙個key,取出它的value

dbt key(

「mykey

」,6); //

多留個/0

dbt data;     //

儲存將要讀出來的資料

if((ret = db.get(null,&skey,&data,0)) == 0)

printf("db: %s: key retrieved: data was %s:%x./n",

(char *)key.get_data(),data.get_data());

else

db.err( ret, "db->get");

2.遍歷所有的key與value

dbt key,data; //聲時要儲存資料變數

dbc

cursor;   //游標

db.cursor

(null,&cursor,0);     //

取得當前資料庫的游標

while((ret = cursor->get(&key,&data,db_next))==0)   //db_next

也就是指向下一條

//data

則需要還原為你的結構,與上面的方法相反,這裡不多做介紹了.

刪除記錄:

dbt key(

「mykey

」,6);

if((ret = db.del(null,&key,0))==0)

printf("delete %s/n",(char*)key.get_data());

else

db.err(ret,"db->delete");

刪除所有記錄:

dbt key,data; //聲時要儲存資料變數

dbc

cursor;   //游標

db.cursor

(null,&cursor,0);     //

取得當前資料庫的游標

while((ret = cursor->get(&key,&data,db_next))==0)   //db_next

也就是指向下一條

//不知道為什麼,當我刪除所有記錄的之後,檔案裡仍然可以看到我先前寫入的資料.但是程式是無法讀出了.

Docker 的使用全解

注 一下 必要時加sudo 容器 映象 可讀層。docker run 命令先是利用映象建立了乙個容器,然後執行這個容器。docker start命令為容器檔案系統建立了乙個程序隔離空間。注意,每乙個容器只能夠有乙個程序隔離空間。1 測試docker是否安裝成功 docker run hello wo...

python 使用Berkeley DB資料庫

try from bsddb import db except importerror from bsddb3 import db print db.db version string 檢測是否有bsddb包 def irecords curs record curs.first while rec...

Git使用詳細篇(全解)

版本控制是一種記錄乙個或若干檔案內容變化,以便將來查閱特定版本修訂情況的系統。版本控制系統vcs 可以理解成乙個資料庫,幫助我們完整地儲存乙個專案的快照 配置庫是集中存放在 伺服器,開發者需要先從 伺服器取得最新版本,完成後再推送給 服務 svn 集中式版本控制系統中的代表 分布式也有乙個類似於 配...