Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2675965
  • 博文数量: 877
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 5921
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-05 12:25
个人简介

技术的乐趣在于分享,欢迎多多交流,多多沟通。

文章分类

全部博文(877)

文章存档

2021年(2)

2016年(20)

2015年(471)

2014年(358)

2013年(26)

分类: iOS平台

2015-08-31 15:35:45

数据库(SQLITE3函数总结)
http://blog.csdn.net/zuoyou1314/article/details/38307865?utm_source=tuicool

Sqlite3 的确很好用。小巧、速度快。最近研究它,有一些收获,这里把我对 sqlite3 的研究列出来,以备忘记。

              导入SQLLite library并引入头文件.

               libsqlite3.dylib本身是个链接,在这里它指向libsqlite3.0.dylib。也就是说在这里你添加libsqlite3.dylib和添加libsqlite3.0.dylib其实是添加了同一个文件,没有区别,那为什么要添加libsqlite3.0.dylib呢?原因在于libsqlite3.dylib是旧版的sqlite3动态库,也就是说如果出现了新的动态库(如:libsqlite3.1.dylib)那libsqlite3.dylib将指向这个新的动态库(libsqlite3.1.dylib)所以建议还是要添加libsqlite3.0.dylib。

   (1) 关键数据结构

sqlite 里最常用到的是 sqlite3 * 类型。从数据库打开开始,sqlite就要为这个类型准备好内存,直到数据库关闭,整个过程都需要用到这个类型。当数据库打开时开始,这个类型的变量就代表了你要操作的数据库。下面再详细介绍。

 (2) 打开数据库


打开数据库链接sqlite3_open用法

原型:


[objc] view plaincopy
  1. SQLITE_API int sqlite3_open(  
  2.   const charchar *filename,   /* Database filename (UTF-8) */  
  3.   sqlite3 **ppDb          /* OUT: SQLite db handle */  
  4. );  
用这个函数打开数据库操作。需要传入两个参数,一是数据库文件名,比如ZUOYOU1314Students.sqlite. 在iOS中一般是[fileUTF8String]



    NSString * file = [documentsPathstringByAppendingPathComponent:@"ZUOYOU1314Students.sqlite"];

二是 sqlite3 ** 参数即前面提到的关键数据结构。这个结构底层细节如何,你不要管它。函数返回值表示操作是否正确,如果是 SQLITE_OK 则表示操作正常。相关的返回值sqlite定义了一些宏。具体这些宏的含义可以参考 sqlite3.h 文件。里面有详细定义.

参考代码如下:

[objc] view plaincopy
  1. //指向数据库的指针  
  2. static sqlite3 * db = nil;  
  3.   
  4. //打开数据库  
  5. + (sqlite3 *)open  
  6. {  
  7.     //判断数据库对象是否打开, 即db 是否有值  
  8.     if (db != nil) {  
  9.         //db有值, 直接使用,不需要再打开  
  10.         return db;  
  11.     }  
  12.       
  13. #pragma ------第一次实现了拷贝 第二次需要判断documents里面是否已经有数据库文件  
  14.     //先找到documents文档  
  15.     NSString * documentsPath = kDocuments;  
  16.     //在documents 里面 拼接一个文件夹  
  17.     NSString * file = [documentsPath stringByAppendingPathComponent:@"Students.sqlite"];  
  18.     //从包里面取到 叫Students名字 后缀是sqlite的文件  
  19.     NSString * bundleFile = [[NSBundle mainBundle]pathForResource:@"Students" ofType:@"sqlite"];  
  20.     //创建文件管理器  
  21.     NSFileManager * fileManager = [NSFileManager defaultManager];  
  22.   
  23.   
  24.       
  25.     //判断文件是否存在  
  26.     if ([fileManager fileExistsAtPath:file] == NO) {  
  27.           
  28.         //然后把包里的文件拷贝到documents文件夹里  
  29.         [fileManager copyItemAtPath:bundleFile toPath:file error:nil];  
  30.         //UTF8tring 会把C语言 转换为 OC字符串      
  31.     }  
  32.     sqlite3_open([file UTF8String], &db);  
  33.       
  34.     return db;  
  35. }  


(3) 关闭数据库

原型:
[objc] view plaincopy
  1. SQLITE_API int sqlite3_close(sqlite3 *);  

参考代码如下:
[objc] view plaincopy
  1. /关闭数据库  
  2. + (void)close  
  3. {  
  4.     sqlite3_close(db);  
  5.     db = nil;      
  6. }  

   (4) SQL语句操作


  (一)  sqlite3_exec:

原型:


[objc] view plaincopy
  1. SQLITE_API int sqlite3_exec(  
  2.   sqlite3*,                                  /* An open database */  
  3.   const charchar *sql,                           /* SQL to be evaluated */  
  4.   int (*callback)(void*,int,char**,char**),  /* Callback function */  
  5.   voidvoid *,                                    /* 1st argument to callback */  
  6.   charchar **errmsg                              /* Error msg written here */  
  7. );  


这就是执行一条 sql 语句的函数。

1个参数不再说了,是前面open函数得到的指针。说了是关键数据结构。

2个参数const char *sql 是一条 sql 语句,以/0结尾。

3个参数sqlite3_callback 是回调,当这条语句执行之后,sqlite3会去调用你提供的这个函数。

4个参数void * 是你所提供的指针,你可以传递任何一个指针参数到这里,这个参数最终会传到回调函数里面,如果不需要传递指针给回调函数,可以填NULL。等下我们再看回调函数的写法,以及这个参数的使用。

5个参数char ** errmsg 是错误信息。注意是指针的指针。sqlite3里面有很多固定的错误信息。执行 sqlite3_exec之后,执行失败时可以查阅这个指针(直接 printf(%s/n,errmsg))得到一串字符串信息,这串信息告诉你错在什么地方。sqlite3_exec函数通过修改你传入的指针的指针,把你提供的指针指向错误提示信息,这样sqlite3_exec函数外面就可以通过这个 char*得到具体错误提示。

说明:通常,sqlite3_callback 和它后面的 void * 这两个位置都可以填 NULL。填NULL表示你不需要回调。比如你做 insert 操作,做 delete 操作,做update 操作,就没有必要使用回调。而当你做 select 时,就要使用回调,因为 sqlite3 把数据查出来,得通过回调告诉你查出了什么数据。

参考代码如下:



[objc] view plaincopy
  1. - (void)deleteButton  
  2. {  
  3.     //打开数据库  
  4.     sqlite3 * db = [DB open];  
  5.     //执行删除      
  6. int falg =  sqlite3_exec(db, "delete from BJS140523 where sName like '坐'"NULLNULL, nil);  
  7.     NSLog(@"444444  falg = %d",falg);  
  8. }  




(二 ) sqlite3_prepare_v2:

原型:


[objc] view plaincopy
  1. SQLITE_API int sqlite3_prepare_v2(  
  2.   sqlite3 *db,            /* Database handle */  
  3.   const charchar *zSql,       /* SQL statement, UTF-8 encoded */  
  4.   int nByte,              /* Maximum length of zSql in bytes. */  
  5.   sqlite3_stmt **ppStmt,  /* OUT: Statement handle */  
[objc] view plaincopy
  1. <span style="font-family: 'Comic Sans MS';">   const charchar **pzTail     /* OUT: Pointer to unused portion of zSql */</span>  




参考代码如下:



[objc] view plaincopy
  1. int flag =sqlite3_prepare_v2(db, "select * from BJS140523 "  , -1, &stmt, nil);  








(三) sqlite3_column_

原型:


[objc] view plaincopy
  1. SQLITE_API const voidvoid *sqlite3_column_blob(sqlite3_stmt*, int iCol);  
  2. SQLITE_API int sqlite3_column_bytes(sqlite3_stmt*, int iCol);  
  3. SQLITE_API int sqlite3_column_bytes16(sqlite3_stmt*, int iCol);  
  4. SQLITE_API double sqlite3_column_double(sqlite3_stmt*, int iCol);  
  5. SQLITE_API int sqlite3_column_int(sqlite3_stmt*, int iCol);  
  6. SQLITE_API sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol);  
  7. SQLITE_API const unsigned charchar *sqlite3_column_text(sqlite3_stmt*, int iCol);  
  8. SQLITE_API const voidvoid *sqlite3_column_text16(sqlite3_stmt*, int iCol);  
  9. SQLITE_API int sqlite3_column_type(sqlite3_stmt*, int iCol);  
  10. SQLITE_API sqlite3_value *sqlite3_column_value(sqlite3_stmt*, int iCol);  



参考代码如下:



[objc] view plaincopy
  1. int sID = sqlite3_column_int(stmt, 0);//列的编号从0开始  
  2. const unsigned charchar * sName = sqlite3_column_text(stmt, 1);  
  3. int sAge = sqlite3_column_int(stmt, 2);  
  4. const unsigned charchar * sSex = sqlite3_column_text(stmt, 3);  




(四)sqlite3_step()


原型:

[objc] view plaincopy
  1. SQLITE_API int sqlite3_step(sqlite3_stmt*);  



参考代码如下:


[objc] view plaincopy
  1. if (falg == SQLITE_OK) {  
  2.         sqlite3_step(stmt);  
  3.     }  



(五)sqlite3_finalize()

原型:


[objc] view plaincopy
  1. SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt);  



参考代码如下:



[objc] view plaincopy
  1. sqlite3_finalize(stmt);  



(六) sqlite3_bind_text



//bind  绑定 

原型:



[objc] view plaincopy
  1. SQLITE_API int sqlite3_bind_blob(sqlite3_stmt*, intconst void*, int n, void(*)(void*));  
  2. SQLITE_API int sqlite3_bind_double(sqlite3_stmt*, intdouble);  
  3. SQLITE_API int sqlite3_bind_int(sqlite3_stmt*, intint);  
  4. SQLITE_API int sqlite3_bind_int64(sqlite3_stmt*, int, sqlite3_int64);  
  5. SQLITE_API int sqlite3_bind_null(sqlite3_stmt*, int);  
  6. SQLITE_API int sqlite3_bind_text(sqlite3_stmt*, intconst char*, int n, void(*)(void*));  
  7. SQLITE_API int sqlite3_bind_text16(sqlite3_stmt*, intconst void*, intvoid(*)(void*));  
  8. SQLITE_API int sqlite3_bind_value(sqlite3_stmt*, intconst sqlite3_value*);  
  9. SQLITE_API int sqlite3_bind_zeroblob(sqlite3_stmt*, intint n);  
参考代码如下:



[objc] view plaincopy
  1. int falg = sqlite3_prepare_v2(db, "update BJS140523 set sSex = ?,sAge = ? where sID = ?", -1, &stmt, nil);  
  2. //绑定  
  3. //问号是从 1 开始的  
  4.   
  5. sqlite3_bind_text(stmt,1,[sex UTF8String], -1NULL);  
  6. sqlite3_bind_int(stmt, 2, age);  
  7. sqlite3_bind_int(stmt, 3, sID);  
阅读(721) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~