#include <iostream> #include <sqlite3.h> using namespace std; int main() { cout << "Hello World!" << endl; sqlite3 *sql = NULL; // 一個打開的數據庫實例 const char * path = "/home/gaoyuan/temp/test.db";//某個sql文件的路徑 // 根據文件路徑打開數據庫鏈接。若是數據庫不存在,則建立。 // 數據庫文件的路徑必須以C字符串傳入。 int result = sqlite3_open_v2(path, &sql, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_NOMUTEX | SQLITE_OPEN_SHAREDCACHE, NULL); if (result == SQLITE_OK) { std::clog << "打開數據庫鏈接成功"; } else { std::clog << "打開數據庫鏈接失敗"; } return 0; }
打開或者建立數據庫ios
const char *sqlSentence = "INSERT INTO t_person(name, age) VALUES('夏明', 22); "; //SQL語句 sqlite3_stmt *stmt = NULL; //stmt語句句柄 //進行插入前的準備工做——檢查語句合法性 //-1表明系統會自動計算SQL語句的長度 int result = sqlite3_prepare_v2(sql, sqlSentence, -1, &stmt, NULL); if (result == SQLITE_OK) { std::clog<< "添加數據語句OK"; //執行該語句 sqlite3_step(stmt); } else { std::clog << "添加數據語句有問題"; } //清理語句句柄,準備執行下一個語句 sqlite3_finalize(stmt);
執行不返回數據的SQL語句(增、刪、改)。sql
執行更新、刪除語句和執行創表、添加語句基本相似,只需更改sql語句便可。)數據庫
const char *sqlSentence = "SELECT name, age FROM t_person WHERE age < 30;"; //SQL語句 sqlite3_stmt *stmt = NULL; // stmt語句句柄 //進行查詢前的準備工做——檢查語句合法性 //-1表明系統會自動計算SQL語句的長度 int result = sqlite3_prepare_v2(sql, sqlSentence, -1, &stmt, NULL); if (result == SQLITE_OK) { std::clog << "查詢語句OK"; // 每調一次sqlite3_step()函數,stmt語句句柄就會指向下一條記錄 while (sqlite3_step(stmt) == SQLITE_ROW) { // 取出第0列字段的值 const unsigned char *name = sqlite3_column_text(stmt, 0); // 取出第1列字段的值 int age = sqlite3_column_int(stmt, 1); //輸出相關查詢的數據 std::clog << "name = " << name <<", age = "<< age; } } else { std::clog << "查詢語句有問題"; } //清理語句句柄,準備執行下一個語句 sqlite3_finalize(stmt);
執行返回數據的SQL語句(查)。緩存
if (sql) { sqlite3_close_v2(sql); sql = nullptr; }
關閉數據庫:sqlite3_close_v2(sqlite3* sql)多線程
1.打開數據庫函數
int sqlite3_open_v2( const char *filename, // 數據庫的文件路徑 sqlite3 **ppDb, // 數據庫實例 int flags, // 標誌 const char *zVfs // 使用該數據庫的虛擬機的名字,這裏咱們不須要用,直接NULL );
其中:工具
flags參數有以下標誌:
SQLITE_OPEN_NOMUTEX: 設置數據庫鏈接運行在多線程模式(沒有指定單線程模式的狀況下)
SQLITE_OPEN_FULLMUTEX:設置數據庫鏈接運行在串行模式。
SQLITE_OPEN_SHAREDCACHE:設置運行在共享緩存模式。
SQLITE_OPEN_PRIVATECACHE:設置運行在非共享緩存模式。
SQLITE_OPEN_READWRITE:指定數據庫鏈接能夠讀寫。
SQLITE_OPEN_CREATE:若是數據庫不存在,則建立。spa
2.檢查SQL語句的合法性(查詢前的準備)線程
若語句合法即編譯經過,則將語句產生的指令塞進stmt句柄(此時並未執行指令)調試
int sqlite3_prepare_v2( sqlite3 *db, // 數據庫實例 const char *zSql, // 須要檢查的SQL語句 int nByte, // SQL語句的最大字節長度 sqlite3_stmt **ppStmt, // stmt句柄,用來存儲SQL stmt指令 const char **pzTail );
3.執行stmt句柄(執行存儲在stmt句柄的指令)
若是指令能查詢到下一行數據,就會返回SQLITE_ROW
若是指令(例如寫入數據)不須要返還數據,就會返還SQLITE_DONE
int sqlite3_step( sqlite3_stmt* stmt //stmt句柄 );
4.利用stmt句柄得到第iCol字段的值(字段的下標從0開始)
//執行完查詢句柄後,stmt就會指向查到的數據
//而後能夠經過stmt獲取相應數據
double sqlite3_column_double(sqlite3_stmt*, int iCol); // 浮點數據 int sqlite3_column_int(sqlite3_stmt*, int iCol); // 整型數據 sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol); // 長整型數據 const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); // 二進制文本數據 const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol); // 字符串數據
其餘:
清理語句句柄(以便重複使用同一個stmt句柄)
int sqlite3_finalize( sqlite_stmt* stmt //stmt句柄 );
關閉數據庫鏈接
int sqlite3_close_v2( sqlite3 * sql, // 數據庫實例 );
直接編譯並執行 SQL語句
(不推薦使用:一、沒有SQL語法檢查 二、每一句SQL語句即便徹底同樣,也會從新編譯執行,對批量指令來講效率不高。)
int sqlite3_exec( sqlite3* sql, // 一個打開的數據庫實例 const char * sqlSentence, // 須要執行的SQL語句 int (*callback)(void*,int,char**,char**), // SQL語句執行完畢後的回調 void *, // 回調函數的第1個參數 char **errmsg // 錯誤信息 );
SQLiteStudio是一個可視化的數據庫管理工具。
經過可視化界面,它能夠方便快捷地查看或操做數據庫信息。
它是程序sqlite數據調試檢查不可或缺的輔助工具。
(界面大概如圖:)
SQLiteStudio 下載地址:https://sqlitestudio.pl/index.rvt?act=download