Mac OS X Sqlite编程应用

http://blog.csdn.net/kanghua68/article/details/6168897

Sqlite是一个轻量级的数据库引擎,大概几百K左右,所以在嵌入式设备中应用广泛;而且由于接口简单,使其在非嵌入式领域中也被大量使用; 详细内容请参考官方介绍:http://www.sqlite.org/about.html,这里就不再赘述;

一、工程中引入sqlite3

数据库创建前需要在程序中引入sqlite3库文件以及在代码中添加sqlite3头文件;以XCode开发环境为例,需要在“Target->Build->Other Linker Flags”中加入“-lsqlite3”链接选项;代码文件中加入#import <sqlite3.h>;

二、数据库创建

数据库创建类似文件创建,使用sqlite3_open()函数,如果不存在就创建,如果存在就打开;

[cpp]  view plain copy
  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文件有个区别;数据文件首次创建后,还需要创建表;代码如下:

[cpp]  view plain copy
  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编码)直接输入中文字符,能够正常执行,其他编码格式没有试过,感觉应该不会有什么问题,改天有时间尝试一下;

[cpp]  view plain copy
  1. //insert three item  
  2.   
  3. sql = "INSERT INTO /"ContactTbl/" VALUES(NULL, '小康', '18602914000', 'xiaokang@183.com');";  
  4. sqlite3_exec(db, sql, 0, 0, &zErrMsg);  
  5. printf("%s/n",zErrMsg);  

四、数据库查询

使用sqlite3_get_table()进行数据查询时,返回一个char **类型的字符数组;返回的行列值分别是表中数据的行和列数目;需要注意的是,返回的字符数组比实际数据多了一行表头;所以在使用和输出时需要注意;按照上面的数据格式,行、列值分别为1、4;而字符数组的数目为(nRow+1)*nColumn;

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

下面是格式输出代码:

[cpp]  view plain copy
  1. //printf("ID/t/t姓名/t/t电话/t/t电子邮件/t/t/n");  
  2.   
  3. //此处不需要输出表头,因为字符数组中已经包括表头  
  4.   
  5. int rowIndex;  
  6. for(rowIndex=0; rowIndex<(nRow+1)*nColumn; rowIndex++)  
  7. {  
  8.         printf("%s/t/t", aResult[rowIndex]);  
  9.         if(0==(rowIndex+1)%nColumn)   
  10.         {  
  11.                printf("/n");  
  12.         }  
  13.   
  14. }  
  15. 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()函数释放;

五、数据库删除

数据库条目的删除和插入类似,代码如下:

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

下面附上整个main.m的源代码:

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

最后的删除语句用于在测试后删除数据库文件,避免重复执行后数据库中有重复条目,呵呵;针对以上代码,Consel输出如下:

[cpp]  view plain copy
  1. (null)  
  2.   
  3. (null)  
  4. (null)  
  5. (null)  
  6. (null)  
  7. ID           Name             TEL1             EMAIL            
  8. 1             小康              18602914000         xiaokang@183.com                
  9. 2             小陈              18602935000         xiaochen@183.com                
  10. 3             小霞              18602966000         xiaoxia@183.com           
  11. (null)  
  12. After delete the ID 3  
  13. ID           Name             TEL1             EMAIL            
  14. 1             小康              18602914000         xiaokang@183.com                
  15. 2             小陈              18602935000         xiaochen@183.com  


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值