1. 程式人生 > >Mac OS X Sqlite程式設計應用

Mac OS X Sqlite程式設計應用

Sqlite是一個輕量級的資料庫引擎,大概幾百K左右,所以在嵌入式裝置中應用廣泛;而且由於介面簡單,使其在非嵌入式領域中也被大量使用; 詳細內容請參考官方介紹:http://www.sqlite.org/about.html,這裡就不再贅述;

一、工程中引入sqlite3

資料庫建立前需要在程式中引入sqlite3庫檔案以及在程式碼中新增sqlite3標頭檔案;以XCode開發環境為例,需要在“Target->Build->Other Linker Flags”中加入“-lsqlite3”連結選項;程式碼檔案中加入#import <sqlite3.h>;

二、資料庫建立

資料庫建立類似檔案建立,使用sqlite3_open()函式,如果不存在就建立,如果存在就開啟;

  1. sqlite3 *db = NULL;  
  2. int rc;  
  3. char * dbPath = "myTest.db3";  
  4. rc = sqlite3_open(dbPath, &db);  
  5. if(rc)  
  6. {  
  7.     printf("Open database failed!");  
  8.     sqlite3_close(db);  
  9.     return 1;  
  10. }  

       使用sqlite3建立的資料庫檔名稱以db3作為檔案型別並非必需,而是和sqlite檔案有個區別;資料檔案首次建立後,還需要建立表;程式碼如下:

  1. //create or open Table  
  2. char
     *sql = 
    " CREATE TABLE ContactTbl("/  
  3.                         "ID INTEGER PRIMARY KEY,"/  
  4.                         "Name VARCHAR(80),"/  
  5.                         "TEL1 VARCHAR(20),"/  
  6.                         "EMAIL VARCHAR(40)"/  
  7.                              ");";  
  8. sqlite3_exec(db, sql, 0, 0, &zErrMsg);  
  9. printf("%s/n"
    ,zErrMsg);  

       網上有許多檢視和編輯sqlite3資料庫檔案的視覺化小工具,例如:SQLiteSpy.exe;這樣進行資料庫分析和修改時就不必每次都自己寫程式碼來操作了;

三、資料庫插入

向剛才新建的表中新增一個條目,由於sqlite網站中都是英文資料型別,我使用UTF8編碼格式的程式碼檔案(XCode預設程式碼檔案格式為UTF8編碼)直接輸入中文字元,能夠正常執行,其他編碼格式沒有試過,感覺應該不會有什麼問題,改天有時間嘗試一下;

  1. //insert three item  
  2. sql = "INSERT INTO /"ContactTbl/" VALUES(NULL, '小康', '18602914000', '[email protected]');";  
  3. sqlite3_exec(db, sql, 0, 0, &zErrMsg);  
  4. printf("%s/n",zErrMsg);  

四、資料庫查詢

使用sqlite3_get_table()進行資料查詢時,返回一個char **型別的字元陣列;返回的行列值分別是表中資料的行和列數目;需要注意的是,返回的字元陣列比實際資料多了一行表頭;所以在使用和輸出時需要注意;按照上面的資料格式,行、列值分別為1、4;而字元陣列的數目為(nRow+1)*nColumn;

  1. //query data, don't forget to free the result  
  2. char **aResult = NULL;  
  3. int nRow = 0;  
  4. int nColumn = 0;  
  5. sql = "SELECT * FROM ContactTbl";  
  6. sqlite3_get_table(db, sql, &aResult, &nRow, &nColumn, &zErrMsg);  
  7. printf("%s/n",zErrMsg);  

下面是格式輸出程式碼:

  1. //printf("ID/t/t姓名/t/t電話/t/t電子郵件/t/t/n");  
  2. //此處不需要輸出表頭,因為字元陣列中已經包括表頭  
  3. int rowIndex;  
  4. for(rowIndex=0; rowIndex<(nRow+1)*nColumn; rowIndex++)  
  5. {  
  6.         printf("%s/t/t", aResult[rowIndex]);  
  7.         if(0==(rowIndex+1)%nColumn)   
  8.         {  
  9.                printf("/n");  
  10.         }  
  11. }  
  12. sqlite3_free_table(aResult);  
  

例如下面這張表以及查詢結果資料格式列舉如下:

Name        | Age

-----------------------

Alice       | 43

Bob         | 28

Cindy       | 21

aResult[0] = "Name";

aResult[1] = "Age";

aResult[2] = "Alice";

aResult[3] = "43";

aResult[4] = "Bob";

aResult[5] = "28";

aResult[6] = "Cindy";

aResult[7] = "21";

簡單說,獲取到的字元陣列就是將表中某行某列(包括表頭),作為一個字串,這樣依次儲存下來,成為一個字串陣列,編碼格式為UTF8;

另外,由於查詢返回的字元陣列是在sqlite3_get_table()函式內部分配的記憶體空間,使用完成後需要使用sqlite3_free_table()函式進行釋放,此處不能簡單的通過sqlite3_free()函式釋放;

五、資料庫刪除

資料庫條目的刪除和插入類似,程式碼如下:

  1. //delete item  
  2. sql = "DELETE FROM ContactTbl WHERE ID = 3;";  
  3. sqlite3_exec(db, sql, 0, 0, &zErrMsg);  
  4. printf("%s/n",zErrMsg);  

下面附上整個main.m的原始碼:

  1. //  
  2. //  main.m  
  3. //  sqlite3Test  
  4. //  
  5. //  Created by kh on 10-11-22.  
  6. //  Copyright 2010 cx. All rights reserved.  
  7. //  
  8. #import <sqlite3.h>  
  9. #import <Cocoa/Cocoa.h>  
  10. int main(int argc, char *argv[])  
  11. {  
  12. sqlite3 *db = NULL;  
  13. int rc;  
  14. char * zErrMsg = NULL;  
  15. char * dbPath = "myTest.db3";  
  16. //create or open database  
  17. rc = sqlite3_open(dbPath, &db);  
  18. if(rc)  
  19. {  
  20.         printf("Open database failed!");  
  21.         sqlite3_close(db);  
  22.         return 1;  
  23. }  
  24. //create or open Table  
  25. char *sql = " CREATE TABLE ContactTbl("/  
  26.                         "ID INTEGER PRIMARY KEY,"/  
  27.                         "Name VARCHAR(80),"/  
  28.                         "TEL1 VARCHAR(20),"/  
  29.                         "EMAIL VARCHAR(40)"/  
  30.                              ");";  
  31. sqlite3_exec(db, sql, 0, 0, &zErrMsg);  
  32. printf("%s/n",zErrMsg);  
  33. //insert three item  
  34. sql = "INSERT INTO /"ContactTbl/" VALUES(NULL, '小康', '18602914000', '[email protected]');";  
  35. sqlite3_exec(db, sql, 0, 0, &zErrMsg);  
  36. printf("%s/n",zErrMsg);  
  37. sql = "INSERT INTO /"ContactTbl/" VALUES(NULL, '小陳', '18602935000', '[email protected]');";  
  38. sqlite3_exec(db, sql, 0, 0, &zErrMsg);  
  39. printf("%s/n",zErrMsg);  
  40. sql = "INSERT INTO /"ContactTbl/" VALUES(NULL, '小霞', '18602966000', '[email protected]');";  
  41. sqlite3_exec(db, sql, 0, 0, &zErrMsg);  
  42. printf("%s/n",zErrMsg);  
  43. //query data, don't forget to free the result  
  44. char **aResult = NULL;  
  45. int nRow = 0;  
  46. int nColumn = 0;  
  47. sql = "SELECT * FROM ContactTbl";  
  48. sqlite3_get_table(db, sql, &aResult, &nRow, &nColumn, &zErrMsg);  
  49. printf("%s/n",zErrMsg);  
  50. //printf("ID/t/t姓名/t/t電話/t/t電子郵件/t/t/n");  
  51. int rowIndex;  
  52. for(rowIndex=0; rowIndex<(nRow+1)*nColumn; rowIndex++)  
  53. {  
  54.         printf("%s/t/t", aResult[rowIndex]);  
  55.         if(0==(rowIndex+1)%nColumn)   
  56.         {  
  57.                printf("/n");  
  58.         }  
  59. }  
  60. sqlite3_free_table(aResult);  
  61. //delete item  
  62. sql = "DELETE FROM ContactTbl WHERE ID = 3;";  
  63. sqlite3_exec(db, sql, 0, 0, &zErrMsg);  
  64. printf("%s/n",zErrMsg);  
  65. //and requery the data  
  66. sql = "SELECT * FROM ContactTbl";  
  67. sqlite3_get_table(db, sql, &aResult, &nRow, &nColumn, &zErrMsg);  
  68. printf("After delete the ID 3/n");  
  69. for(rowIndex=0; rowIndex<(nRow+1)*nColumn; rowIndex++)  
  70. {  
  71.         printf("%s/t/t", aResult[rowIndex]);  
  72.         if(0==(rowIndex+1)%nColumn)   
  73.         {  
  74.                printf("/n");  
  75.         }  
  76. }  
  77. sqlite3_close(db);  
  78. char para[50] = {0};  
  79. sprintf(para, "rm %s", dbPath);  
  80. system(para);  
  81. return 0;  
  82. }  

最後的刪除語句用於在測試後刪除資料庫檔案,避免重複執行後資料庫中有重複條目,呵呵;針對以上程式碼,Consel輸出如下:

  1. (null)  
  2. (null)  
  3. (null)  
  4. (null)  
  5. (null)  
  6. ID           Name             TEL1             EMAIL            
  7. 1             小康              18602914000         [email protected]                
  8. 2             小陳              18602935000         [email protected]                
  9. 3             小霞              18602966000         [email protected]           
  10. (null)  
  11. After delete the ID 3  
  12. ID           Name             TEL1             EMAIL            
  13. 1             小康              18602914000         [email protected]                
  14. 2             小陳              18602935000         [email protected]  


相關推薦

Mac OS X Sqlite程式設計應用

Sqlite是一個輕量級的資料庫引擎,大概幾百K左右,所以在嵌入式裝置中應用廣泛;而且由於介面簡單,使其在非嵌入式領域中也被大量使用; 詳細內容請參考官方介紹:http://www.sqlite.org/about.html,這裡就不再贅述; 一、工程中引入sqlite

Mac OS X核心程式設計,MAC驅動開發資源彙總

一.Mac  OS  X核心程式設計開發官方文件: I/O Kit Fundamentals: I/O Kit基礎 - Mac OS X系統核心程式設計 Threading Programming Guide:MAC OS X 執行緒程式設計指南 - Mac OS

Qt在Mac OS X下的程式設計環境搭建

在Mac OS X下使用Qt開發,需要配置Qt庫和編譯器。編譯器只能使用蘋果公司自主研發的Clang。 1、分別下載並安裝XCode和Command Line Tools(必須安裝),安裝完畢後,Clang就有了。 2、下載Qt並預設安裝 http://dow

U 盤全新安裝 Mac OS X 提示【這個“安裝 OS X ……”應用程式副本不能驗證】的解決方法

如果網路好,也嫌如下安裝是 10.10 系統,可以使用 option + R 進行網路恢復。不過好像大部分人都會死於半路…… 如果 OS X 系統廢了,需要重新安裝,則在另一臺 Windows 系統上用 TransMac 製作啟動盤 在製作好了以後,按住

通過ADB操作/檢視SQLite資料庫以及Mac OS X下adb shell配置與啟動

在Android系統中的資料持久化方案常用的有如下三種: 檔案儲存 – 檔案儲存路徑為:data/data/包名/files SharedPreferences儲存 – SharedPrefere

Mac OS X下從服務程序中啟動另一個應用程式(Cocoa Application)

- (void) launchAppliction: (NSString*) appPath{ //appPath指向可執行檔案的絕對地址 NSTask *softTask = [[NSTask alloc]init]; [softTask setLaunchPath:appPath]; [softTask

Mac 軟件專題之:OS X Yosemite 精彩應用軟件推薦

文章 server -h 學習工具 查詢 mat 對象 軟件開發 用戶界面 目前,很多軟件都已經發布了針對Yosemite系統的版本,今天和大家分享專題:「OS X Yosemite 精彩應用」,主要分享適配Yosemite系統全新的扁平化界面和新功能的軟件,但要知道未在此

Mac OS X中下載Android源代碼的一些經驗

總結 同步 uil 空白 googl 新版 -h 教程 files 首先說明。隨著最近(2014年6月開始)GFW的升級。這個站點:http://www.android.com/ 已經不能正常訪問了,以下的這些操作均是在我連接VPN的時候進行的。 首先,須要做一些準

Mac OS X ntp服務

mac os x ntp服務 Mac OS X系統默認是開啟ntp服務的,也就是你可以使用任意一臺安裝了Mac OS的計算機作為ntp服務器,如果沒有開啟請參考我之前的這篇博文將其開啟:http://asherwang.blog.51cto.com/11255017/1855135;我之前所在的

VMware Workstation安裝Mac OS X

os x一、虛擬機安裝Mac系統的前期準備工作1.下載並安裝VMware Workstation Pro 122.下載Mac OS X Unlocker3.下載Mac OS X 10.10的cdr鏡像建議所有程序的安裝路徑為英文。二、Mac OS X安裝1. services.msc停止所有VMware的服務

How to Install wget in OS X如何在Mac OS X下安裝wget並解決configure: error:

configure openssl usr local 解壓 fix 官網下載 .org get 1.ftp://ftp.gnu.org/gnu/wget/官網下載最新的安裝包 wget-1.19.tar.gz 2.打開終端輸入 tar zxvf wget-1.9.1.ta

FinalShell服務器管理軟件,SSH客戶端下載,支持Windows,Mac OS X,Linux

關註 批量 主機 ren manage ask 速度 運維 分享 FinalShell是一體化的的服務器,網絡管理軟件,不僅是ssh客戶端,還是功能強大的開發,運維工具,充分滿足開發,運維需求.用戶QQ群 342045988Windows版

Mac os x 下配置Intellij IDEA + Tomcat

apply tor project 出現 打開終端 miss 1-1 doc 問題 IDEA 建工程 1. 首先是 new project--->create project from scratch---> 取個名字 --->next--->

Mac OS X取消Apache(httpd)開機啟動

daemon class sys processor plist load 關閉 開機 ces 關閉http開機啟動 sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist

VMware虛擬機安裝Mac OS X

定義 輸入 http 選項 mac system -h macos 導致 安裝mac系統學習網站來源:http://blog.csdn.net/hamber_bao/article/details/51335834 1.下載安裝VMware workstation (1)首

Sublime Text 2 實用快捷鍵[Mac OS X]

tags ref gis href hive ati 書簽 自動縮進 os x lucasfais 總結了一些非常實用的 Sublime Text 2 快捷鍵,Lucifr 將它們翻譯成了中文,以方便查閱。 註意:修飾鍵(如?)後跟多個按鍵的情況表示在按住修飾鍵的情況

Mac OS X文件系統的附加屬性@如何徹底刪除

刪除 mir end xtend 轉載 顯示 txt xxx inf 有時候在 Mac 系統下讀寫 NTFS 分區時,會發現一些文件不能打開。 顯示錯誤為: 項目“XXX”已被 OS X 使用,不能打開。 如果再終端 ls -al

Mac OS X中Launchpad的圖標添加刪除方法(添加方法別試了,和Linux很大區別)

com nsh usr folders 單純 ron bsp blank 結構 說明:在Mac下的Launchpad圖標添加和刪除都與應用程序的app文件有關,如果單純的只想在Launchpad添加自定義的圖標,然後指定要某條命令運行時,建議不要這麽幹,Launchpad的

python 在mac os x的環境

.cn img 成功 spa char mac 最新 pan 完成 1 python 1.1.在python的官網下載python的最新版本 1.2 直接安裝,安裝完成後可以在終端輸入python3驗證安裝是否成功。 2 pycharm

Golang (Go語言) Mac OS X下環境搭建 環境變量配置 開發工具配置 Sublime Text 2 【轉】

trick blog mac os https 系統 document cnblogs strong os x 一、安裝Golang的SDK   在官網 http://golang.org/ 直接下載安裝包安裝即可。下載pkg格式的最新安裝包,直接雙擊運行,一路按照提示操作