『壹』 如何通過共享訪問sqlite資料庫 c
1. SQLite資料庫特點
(1)SQLite資料庫是開源的嵌入式資料庫,無需獨立的資料庫引擎,直接嵌入到應用程序進程中,因此,通過API,應用程序可以直接操作它。
(2)事務的處理是原子的,一致的,獨立的,可持久化的(ACID),即使在系統崩潰和掉電後。
(3)SQLite資料庫通過獨占性與共享鎖來實現事務的獨立處理。
(4)一個單獨的跨平台的磁碟文件就能夠存儲一個資料庫。
(5)能支持2TB級的數據。
(6)自包含,無外部依賴性。
(7)支持NULL,INTEGER,NUMERIC,REAL,TEXT和BLOG等數據類型。
(8)SQLite資料庫沒有用戶帳戶的概念。資料庫的許可權僅依賴於文件系統。
2. SQLite資料庫的基本操作
(1)建立資料庫
sqlite3 data.sqlite3
在當前目錄下建立了名為data.sqlite3的資料庫。
(2)建立數據表
create table call_list (id INTEGER PRIMARY KEY, type NUMERIC,telnum NUMERIC,bttime TEXT,tcount NUMERIC,charge_rate NUMERIC,charge_sum NUMERIC);
建立了名為 call_list的數據表,有7個欄位,分別為id,type,telnum,bttime,tcount,charge_sum.charge_rate.
(3)向數據表中插入數據
insert into call_list values ($num,1,2,'new',4,5,6);
(4)查詢數據表中的數據
select * from call_list;
(5)修改call_list表中的數據
update call_list set id=00001000 where id=10001;
(6)刪除表中的數據記錄
delete from call_list where id=1000;
(7)SQlite中的其它常用命令
.tables -列出所有的資料庫中的數據表
.schema tablename -列出指定數據表的結構
.quit -離開資料庫
(8)SQLite資料庫的導入與導出
a.將data.sqlite資料庫的數據全部導出:
sqlite3 data.sqlite
>.output dd.sql
>.mp
這樣,數據就保存在dd.sql的文件中,注意這個文件不是資料庫,而是SQL語句。
然後再把這些數據導入到另外一個資料庫data1.sqlite資料庫中。
sqlite3 data1.sqlite
>.read dd.sql
這樣,數據就從data.sqlite資料庫復制到data1.sqlite資料庫中去了。
b.將數據表中的數據導出到a.txt中去
.output a.txt //輸出重定向到a.txt
select * from call_list;
c.將導出的表中的數據導入到另一個資料庫的新建的表中去
如:當從data.sqlite中的call_list表中導出了數據,再導入到另外一個資料庫表call中去。
首先建立表call.
然後.import a.txt call 即可。
3. C語言操作Sqlite資料庫
API:
int sqlite3_open(const char* filename,sqlite3**ppdb);
第一個參數用來指定資料庫文件名。
第二個參數是一個資料庫標識符指針。
如果打開資料庫成功,則返回0,否則返回一個錯誤代碼。
int sqlite3_close(sqlite3*);
傳遞的參數是資料庫標識符指針用來關閉資料庫,操作成功是返回0,否則返回一個錯誤代碼。
int sqlite3_errcode(sqlite3*db);
const char* sqlite3_errmsg(sqlite3* db);
const char* sqlite3_errmsg16(sqlite3* db);
這三個函數都是返回錯誤信息,第一個函數返回的是最近調用資料庫介面的錯誤代碼,第二,第三個函數是返回最近調用資料庫介面的錯誤信息。第二個函數返回的錯誤信息是用UTF-8編碼的,第三個函數返回的錯誤信息是用UTF-16編碼的。
int sqlite3_exec(sqlite3*,const char*sql,int(*callback)(void*,int,char**,char**),void*,**errmsg);
這個函數非常重用,是用來執行SQLite資料庫的SQL語句的。
第一個參數是sqlite資料庫標識符指針。
第二個參數是要執行的SQL語句。
第三個參數是一個回調函數,在執行查詢操作時用到,其它的操作可以傳空值即NULL。
第四個參數是傳遞給回調函數第一個參數的實參。
第五個參數是一個錯誤信息。
回調函數: int callback(void*,int argc,char** argv,char** cname);
第一個參數是從sqlite3_exec傳遞過來的參數,可以為任意的類型。
第二個參數是查詢的列數。
第三個參數是查詢結果集的值。
第四個參數是列名。
int sqlite3_get_table(sqlite3*db,const char* sql,char***result,int *row,int*col,char** errmsg);
這個函數主要是用來查詢的。
第一個參數是資料庫描述符指針
第二個參數是SQL語句。
第三個參數是查詢的結果集。
第四個參數是結果集中的行數。
第五個參數是結果集中的列數。
第六個參數是錯誤信息。
它查詢出的行數是從欄位名開始的。即第0行是欄位名。
實例:
/**
本例主要實現用Sqlite的回調函數進行查詢
int sqlite3_exec(sqlite3*,const char* sql,int (*callback)(void*,int,char**,char**),void*,errmsg);
第一個參數是資料庫標識符
第二個參數是要執行的sql命令
第三個參數是回調函數
第四個參數是回調函數的第一個參數
第五個參數是用於指示錯誤信息
其中回調函數的形式:
int _sql_callback(void*arg,int argc,char**argv,char**cname);
第二個參數指示結果集中的列數
第三個參數是保存結果集的字元串
第四個參數是結果集中的列名
**/
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sqlite3.h>
#include <time.h>
int _call_back(void*arg,int argc,char** argv,char** cname);
int main(){
int res;
const char*dbfile="data.sqlite1";
char*errmsg=NULL;
sqlite3* db;
res=sqlite3_open(dbfile,&db);
if(res!=0){
perror("資料庫打開失敗");
exit(EXIT_FAILURE);
}
//創建一張數據表
const char* sqlcreate="create table call_list (id INTEGER PRIMARY KEY, type NUMERIC,telnum NUMERIC,bttime TEXT,tcount NUMERIC,charge_rate NUMERIC,charge_sum NUMERIC)";
res=sqlite3_exec(db,sqlcreate,NULL,NULL,&errmsg);
if(res!=0){
perror("建立數據表失敗");
exit(EXIT_FAILURE);
}
//插入100000條數據
int num=0;
struct timeval tv;
gettimeofday (&tv , NULL);
long old=tv.tv_sec;
while(num<100000){
const char* sqlinsert="insert into call_list values ($num,1,2,'new',4,5,6)";
res=sqlite3_exec(db,sqlinsert,NULL,NULL,&errmsg);//插入時不需要用到回調函數
if(res!=0){
perror("插入失敗");
exit(EXIT_FAILURE);
}
num++;
}
gettimeofday(&tv,NULL);
printf("插入100000條數據的時間為:%d秒/n",(tv.tv_sec-old));
//更新
const char* sqlupdate="update call_list set id=00001000 where id=10001";
res=sqlite3_exec(db,sqlupdate,NULL,NULL,&errmsg);
if(res!=0){
perror("更新數據失敗");
exit(EXIT_FAILURE);
}
//刪除
const char* sqldelete="delete from call_list where id=1000";
res=sqlite3_exec(db,sqldelete,NULL,NULL,&errmsg);
if(res!=0){
perror("刪除數據失敗");
exit(EXIT_FAILURE);
}
//查詢
const char* sqlquery="select * from call_list";
res=sqlite3_exec(db,sqlquery,&_call_back,NULL,&errmsg);
if(res!=0){
printf("%s/n",errmsg);
perror("執行失敗/n");
exit(EXIT_FAILURE);
}
res=sqlite3_close(db);
if(res!=0){
perror("資料庫關閉失敗");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
int _call_back(void* arg,int argc,char**argv,char**cname){
int i; //二重指針可以看成指針數組
for(i=0;i<argc;i++){
printf("%s=%s/n",cname[i],argv[i]);
}
return 0;
}
編譯與運行:
gcc -o sql sql.c -lsqlite3
可以看到:插入100000萬條數據,僅需要542秒。因此,SQLite資料庫非常的快。
總之,SQLite資料庫對於小型應用程序的開發是非常高效的,常用於手機(Android),PDA中。
『貳』 sqlite資料庫有啥用。資料庫是幹啥的
資料庫:按照數據結構來組織、存儲和管理數據的倉庫,通俗的講就是按照一定的結構來存儲數據的。
資料庫(database,DB):特點 長期存儲計算機內,有組織(具備一定的結構),可共享,數據集合。
sqlite:輕型的資料庫,可以直接嵌入某款應用中,佔用內存較小,滿足對數據的存儲,查詢需要。
『叄』 sqlite資料庫可以共享嗎
你說的共享是多個客戶端同時訪問么?sqlite是以整個資料庫為鎖防寫的。一次只能有一個客戶端寫入。
『肆』 如何使用多線程同事訪問多個sqlite資料庫
SQLite作為一款小型的嵌入式資料庫,本身沒有提供復雜的鎖定機制,無法內部管理多路並發下的數據操作同步問題,更談不上優化,所以涉及到多路並發的情況,需要外部進行讀寫鎖控制,否則SQLite會返回SQLITE_BUSY錯誤,以駁回相關請求。
返回SQLITE_BUSY主要有以下幾種情況:
1。當有寫操作時,其他讀操作會被駁回
2。當有寫操作時,其他寫操作會被駁回
3。當開啟事務時,在提交事務之前,其他寫操作會被駁回
4。當開啟事務時,在提交事務之前,其他事務請求會被駁回
5。當有讀操作時,其他寫操作會被駁回
6。讀操作之間能夠並發執行
基於以上討論,可以看出這是一個典型的讀者寫者問題,讀操作要能夠共享,寫操作要互斥,讀寫之間也要互斥
可以設計如下的方案解決並發操作資料庫被鎖定的問題,同時保證讀操作能夠保持最大並發
1。採用互斥鎖控制資料庫寫操作
2。只有擁有互斥鎖的線程才能夠操作資料庫
3。寫操作必須獨立擁有互斥鎖
4。讀操作必須能夠共享互斥鎖,即在第一次讀取的時候獲取互斥鎖,最後一次讀取的時候釋放互斥鎖
『伍』 sqlite資料庫並發怎麼解決
使用SQLite經常會遇到並發處理,要處理好多線程或多進程之間的並發,就得搞清楚SQLite的機制,尤其是Sqlite的鎖機制。
因為SQLite是文件資料庫,所以它的鎖也基本是和文件一致,也即:寫獨占,讀共享。這意味是在讀取資料庫的時候,是可以多個線程共享的,而如果有增刪改的操作,則會獨占此文件,其他線程會進程都會被阻塞。
在移動設備上,比較常見的情況是App的UI進程和Service進程同時訪問資料庫,這個時候就要對其訪問做好並發的處理,否則會出現很多意想不到的後果。
『陸』 sqlite資料庫什麼時候用
如果是本地數據的需求用SQlite,如果像登陸有用驗證或者網路間共享數據的話,就需要調用WebService與後台伺服器數據交互,這兩種數據是沒有聯系的。一個是本地資料庫,一個是伺服器端資料庫。本地用資料庫就是SQlite,別的不太可能,終端沒有那麼高的性能,再說甲骨文公司也沒出手機端oracle啊。
如果你的數據是已知的,靜態的,沒有太多的變化,滿可以在本地SQlite中存儲、讀取。這樣不會因網路問題而降低效率和成功率。如果數據未知、有實時的變化或者有與其他用戶交互、共享的數據必然需要後台伺服器數據。
『柒』 android中怎樣共享sqlite資料庫
使用Contentprovider就能實現程序間共享資料庫和數據信息。
『捌』 100分 Sqlite能不能訪問網路上的資料庫呀怎麼訪問
你好。
SQLITE是基於文件系統訪問的,你只能在PC是建立資料庫後以文件共享方式來讓其它用戶訪問。
通過文件共享倒是可以訪問,但是多個進程同時訪問,很容易出問題。
如果我的回答沒能幫助您,請繼續追問。
『玖』 SQlite 網路版
你好,我才用Sqlite和朋友做了一個小系統,感覺還是滿可以的,你可以開一台電腦,作為伺服器,把你的Sqlite文件放上去,映射出來,那麼大家共用想當方便,也不會產生什麼異常,注意一點,你們最好在共享一個資料庫更改的日誌文件,當有人更改了資料庫時,然後就更新上去,那樣別人使用的時候也能隨時,根據需要,更新或重寫自己的代碼
『拾』 sqlite資料庫如何遠程連接
sqlite資料庫如何遠程連接代碼如下:
QSqlDatabase
db
=QSqlDatabase::addDatabase("QSQLITE");
db.setHostName("192.168.1.160");//設置你網路伺服器的IP
db.setDatabaseName("/share/personnel.db");//share共享目錄下的資料庫名
db.setUserName("PersionSql");//資料庫用戶名和密碼
db.setPassword("123456");
if
(!db.open())
qDebug()
<<
"Failed
to
connect
to
QSQLITE";
else
qDebug()
<<
"success!";
說明:訪問網路遠程資料庫則必須要關閉本機和遠程PC機上的防火牆,訪問的遠程資料庫的路徑不能為中文路徑