1,基本信息:sql
1)#include <sqlite3.h>數據庫
2)int rc = sqlite3_open(db_name, &db);//不存在會建立文件macos
3)查詢後直接返回結果 而不是回調函數
int
sqlite3_get_table (sqlite3 *, // 打開的數據庫對象指針
const char * sql, // 要查詢的 sql 語句
char *** resultp, // 查詢結果
int * nrow, // 查詢出多少條記錄(即查出多少行)
int * ncolumn, // 多少個字段(多少列)
char ** errmsg // 錯誤信息
);工具
4)sqlite3_close(sqlite3 *db);測試
5)sqlite3_exec(sqlite3*, const char *sql, int (*callback)(void*,int,char**,char**), void *, char **errmsg);編碼
int
sqlite3_exec ( sqlite3 *db, // 使用 sqlite3_open () 打開的數據庫對象。
const char *sql, // 一條待查詢的 SQL 語句
sqlite3_callback, // 自定義的回調函數,對查詢結果每一行都執行一次這個函數
void *,// 這個void 會直接傳遞到 callback 中的 void 位置;
char **errmsg//出錯信心 能夠爲空
);spa
其中sqlite3_callback 是一個 函數指針;指針
定義爲:調試
typedef int
(*sqlite3_callback) (void *, // 這就是上面函數傳遞的 void * 參數,須要強制類型轉換後才能使用。
int, // 查詢結果的列數,即有多少個字段數
char **, // 保存查詢結果
char ** // 各個字段的名字
);
6)sqlite3_free_table( dbResult );
2, 對於查詢數據 能夠使用getTable 也能夠使用回調方式的 execute;
3,獲取數據庫中的表名: 注意 一個db 文件中可能包含多個table(方法待驗證)
char
*szError = NULL,**dbResult;
int
row,col;
int
result = sqlite3_get_table( db,
"SELECT name FROM sqlite_master WHERE type='table' ORDER BY name"
,&dbResult,&row,&col,&szError );
if
( result == SQLITE_OK )
{
//dbResult就是查詢結果,row和col分別是返回結果集的行數(包含表頭)和列數
sqlite3_free_table(dbResult);
}
else
{
//szError是錯誤描述信息
sqlite3_free(szError);
}
4,查詢 表中 的 字段名; 已經驗證; 網上查到的方法 都存在一些問題,好比當 表 內容爲空時,查詢字段名稱失敗;仍是經過查看官方文檔解決了問題;
sql = "select * from table_name";
//預處理
rc = sqlite3_prepare(db, sql, (int)strlen(sql), &stmt, &tail);
if(rc != SQLITE_OK) {
fprintf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));
}
//rc = sqlite3_step(stmt); [親測: no need to step]
ncols = sqlite3_column_count(stmt);//[tested , got real count]
//[tested , colum names are printed out]
for(i=0; i < ncols; i++) {
fprintf(stderr, "'%s' ", sqlite3_column_text(stmt, i));
}
fprintf(stderr, "\n");
//釋放statement
sqlite3_finalize(stmt);
//關閉數據庫
// sqlite3_close(db); [you can choose not to close]
return 0;
5,運行階段: 環境 macos XCode ;
編譯直接報錯;各類sqlite3 函數找不到
猜想是編譯連接問題; 果斷導入 sqlite3包後 編譯成功;
6,剛纔(PM 10:31 ,2015.03.16;) 封裝的sqlite 工具庫 已經調試完成; 插入,刪除,更新數據,打印數據都已經成功;
可是目前仍是有一點困惑:
1)字段中存在 integer 類型;
2)查詢返回值中返回的類型 是 char**
3) 插入語句是 insert into tb_name values ( 5 , 788 , "stt"); 這條語句是 存儲在char[]
那麼問題來了:
integer 5, 寫入到char[]中時候 應該怎麼寫?
a) 我先使用 int* 磚 char* 方式 ,仍然佔用4 個字節 拷貝進來 ,可是 sqlite 報錯;
b) 使用int 轉字符串 即 5 轉爲 ‘5’, 方式, 工做正常;
問題是: 我一直認爲 在bd 中 的integer 存儲的 integer 字段 , 使用的是 如 int 類型 在內存中同樣;例如1 ,應當佔4個字節,而不是如‘1’ 只佔了一個字節;
還請指正我錯誤的地方。
謝謝;
通過測試,我推測:在查詢語句中 的integer 仍然應當使用 相應的ASC碼值,而在數據庫文件中 仍然將採用整型 數據格式存儲。應當是 sqlite 內部對這個作了次封裝處理;