SQLite3的各个函数(全)

来源:互联网 发布:达瓦黑钢凛怎数据 编辑:程序博客网 时间:2024/06/06 19:22

首先,添加framework:libsqlite3.0.dylib

需要在对应文件的头文件中加入:

  #import "/usr/include/sqlite3.h"

并在Frameworks中加入所需的库,否则会报错:

  Undefined symbols: 
  "_sqlite3_open", referenced from:

加入库的方法是:

image

选择sqlite库:

image

选择完的效果:

image

下面是代码:

//sqlite    常用语句

  1.     [self openDataBase];   
  2.     [self createTable];   
  3.     [self insertTable];   
  4.     [self queryTable];     
  5.     [self deleteTable];   
  6.     [self queryTable];   

实现:

//open database   

  1. - (void)openDataBase   
  2. {   
  3.     NSArray *documentsPaths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask , YES);    
  4.     NSString *databaseFilePath=[[documentsPaths objectAtIndex:0] stringByAppendingPathComponent:@"db.sql"];         
  5.     if (sqlite3_open([databaseFilePath UTF8String], &database)==SQLITE_OK)    
  6.     {    
  7.         NSLog(@"open sqlite db ok.");    
  8.     }   
  9.     else    
  10.     {   
  11.         NSLog( @"can not open sqlite db " );   
  12.    
  13.         //close database   
  14.         sqlite3_close(database);    
  15.     }   
  16. }   

//create table   

  1. - (void)createTable   
  2. {   
  3.     char *errorMsg;   
  4.     const char *createSql="create table if not exists persons (id integer primary key autoincrement,name text)";   
  5.        
  6.     if (sqlite3_exec(database, createSql, NULLNULL, &errorMsg)==SQLITE_OK)    
  7.     {    
  8.         NSLog(@"create ok.");    
  9.     }   
  10.     else    
  11.     {   
  12.         NSLog( @"can not create table" );   
  13.         [self ErrorReport:(NSString *)createSql];   
  14.     }   
  15. }   
  16.    

//insert table   

  1. - (void)insertTable   
  2. {   
  3.     char *errorMsg;   
  4.    
  5.     const char *insertSql="insert into persons (name) values ('田周辉')";    
  6.     if (sqlite3_exec(database, insertSql, NULLNULL, &errorMsg)==SQLITE_OK)    
  7.     {    
  8.         NSLog(@"insert ok.");    
  9.     }   
  10.     else    
  11.     {   
  12.         NSLog( @"can not insert it to table" );   
  13.         [self ErrorReport: (NSString *)insertSql];   
  14.     }   
  15. }   
  16.    

 //error    

  1. - (void)ErrorReport: (NSString *)item   
  2. {   
  3.     char *errorMsg;   
  4.        
  5.     if (sqlite3_exec(database, (const char *)item, NULLNULL, &errorMsg)==SQLITE_OK)   
  6.     {    
  7.         NSLog(@"%@ ok.",item);    
  8.     }   
  9.     else    
  10.     {    
  11.         NSLog(@"error: %s",errorMsg);    
  12.         sqlite3_free(errorMsg);    
  13.     }   
  14. }   
  15.    

//query table   

  1. - (void)queryTable   
  2. {   
  3.     const char *selectSql="select id,name from persons";    
  4.     sqlite3_stmt *statement;    
  5.     if (sqlite3_prepare_v2(database, selectSql, -1, &statement, nil)==SQLITE_OK)   
  6.     {    
  7.         NSLog(@"select ok.");    
  8.         while (sqlite3_step(statement)==SQLITE_ROW)//SQLITE_OK SQLITE_ROW   
  9.         {    
  10.             int _id=sqlite3_column_int(statement, 0);    
  11.             NSString *name=[[NSString alloc] initWithCString:(char *)sqlite3_column_text(statement, 1) encoding:NSUTF8StringEncoding];    
  12.             NSLog(@"row>>id %i, name>> %@",_id,name);    
  13.         }              
  14.     }   
  15.     else    
  16.     {   
  17.         //error   
  18.         [self ErrorReport: (NSString *)selectSql];   
  19.     }          
  20.     sqlite3_finalize(statement);   
  21. }   
  22.    

//delete table   

  1. - (void)deleteTable   
  2. {      
  3.     char *errorMsg;   
  4.     [self openDataBase];          
  5.     const char *sql = "DELETE FROM persons where id=24";   
  6.     if (sqlite3_exec(database, sql, NULLNULL, &errorMsg)==SQLITE_OK)    
  7.     {    
  8.         NSLog(@"delete ok.");    
  9.     }   
  10.     else    
  11.     {   
  12.         NSLog( @"can not delete it" );   
  13.         [self ErrorReport: (NSString *)sql];   
  14.     }   
  15.        
  16. }   

命令行:

sqlite3 database  //创建数据库 
  1.         crate table tableFile(id smallint, file_name varchar(256), up_state smallint, file_size smallint); //创建一个表格 
  2.         insert into tableFile values(1, "200110101.rcu", 100, 4500);   //插入数据 
  3. 如何访问SQLite3数据库 ?
  4. sqlite3_open //打开数据库 
  5. sqlite3_prepare //将UTF-8格式的SQL语句转换为指向已备语句的指针 
  6. sqlite3_column_string //返回某一行的字符串 
  7. sqlite3_finalize //删除一条已备语句 
  8. sqlite3_close //关闭数据库 
  9.  
source code 
  1.  
  2. - (id)lookupSingularSQL:(NSString *)sql forType:(NSString *)rettype {  
  3. sqlite3_stmt *statement;  
  4. id result;  
  5. if (statement = [self prepare:sql]) {  
  6. if (sqlite3_step(statement) == SQLITE_ROW) {  
  7. if ([rettype compare:@"text"] == NSOrderedSame) {  
  8. char temp_buf[256];  
  9. memset(temp_buf, 0, 256);  
  10. sprintf(temp_buf, "%s %s %s %s",  (char *)sqlite3_column_text(statement,0), (char *)sqlite3_column_text(statement,1), 
  11.  (char *)sqlite3_column_text(statement,2), (char *)sqlite3_column_text(statement,3));  
  12. result = [NSString stringWithUTF8String:temp_buf];  
  13. //result = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement,0)];  
  14. else if ([rettype compare:@"integer"] == NSOrderedSame) {  
  15. result = (id)sqlite3_column_int(statement,0);  
  16.              
  17.  
  18.  
  19. sqlite3_finalize(statement);  
  20. return result;  

应该有个成员变量,比如我的代码:

  1. @interface DetailViewController : UIViewController { 
  2. UIPopoverController *popoverController; 
  3. UIToolbar *toolbar; 
  4. id detailItem; 
  5. UILabel *detailDescriptionLabel; 
  6. sqlite3 *database

打开数据库

SQLite数据库是文件数据库,是保存在文件系统中的。因此需要知道文件保存到哪里,可参见iOS中对文件的操作。比如本文保存到Documents目录下。代码:

  1. NSArray *documentsPaths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask , YES); 
  2. NSString *databaseFilePath=[[documentsPaths objectAtIndex:0] stringByAppendingPathComponent:@"mydb"]; 
  3. if (sqlite3_open([databaseFilePath UTF8String], &database)==SQLITE_OK) 
  4. NSLog(@"open sqlite db ok."); 

通过ssh查看Documents目录,发现mydb文件已经创建。sqlite的策略是如果有该文件就打开,如果没有就创建文件,也就是创建数据库。

这里要注意,使用的是C语法,sqlite3_open传入的是database的地址。

关闭数据库

数据库使用完毕后,要关闭,比如退出应用的时候:

  1. - (void)viewDidUnload { 
  2. // Release any retained subviews of the main view
  3. // e.g. self.myOutlet = nil; 
  4. sqlite3_close(database); 
  5. self.popoverController = nil; 

建表语句

数据库打开以后,如果没有表,建表:

  1. char *errorMsg; 
  2. const char *createSql="create table if not exists persons (id integer primary key autoincrement,name text)"
  3. if (sqlite3_exec(database, createSql, NULLNULL, &errorMsg)==SQLITE_OK) { 
  4. NSLog(@"create ok."); 

这里要特别注意errorMsg传的是地址,因为该函数要通过地址引用来写报错字符信息。

向表中插入记录

和建表语句类似:

  1. const char *insertSql="insert into persons (name) values(‘张三’)"
  2. if (sqlite3_exec(database, insertSql, NULLNULL, &errorMsg)==SQLITE_OK) { 
  3. NSLog(@"insert ok."); 

错误信息的处理

如果在多个地方使用errorMsg,那么每次使用完毕要清空一下字串,比如这样:

  1. if (sqlite3_exec(database, createSql, NULLNULL, &errorMsg)==SQLITE_OK) { 
  2. NSLog(@"create ok."); 
  3. }else { 
  4. NSLog(@"error: %s",errorMsg); 
  5. sqlite3_free(errorMsg); 

查询结果集

结果集的查询,需要用到statement:

  1. const char *selectSql="select id,name from persons"
  2. sqlite3_stmt *statement; 
  3. if (sqlite3_prepare_v2(database, selectSql, -1, &statement, nil)==SQLITE_OK) { 
  4. NSLog(@"select ok."); 
  5. while (sqlite3_step(statement)==SQLITE_ROW) { 
  6. int _id=sqlite3_column_int(statement, 0); 
  7. char *name=(char *)sqlite3_column_text(statement, 1); 
  8. NSLog(@"row>>id %i, name %s",_id,name); 
  9. sqlite3_finalize(statement); 

不过这里有个问题,看看打印的日志:

image

乱码。因为直接用的char类型来做的。

解决办法是,用nsstring替代char:

  1. while (sqlite3_step(statement)==SQLITE_ROW) { 
  2. int _id=sqlite3_column_int(statement, 0); 
  3. NSString *name=[[NSString alloc] initWithCString:(char *)sqlite3_column_text(statement, 1) encoding:NSUTF8StringEncoding]; 
  4. NSLog(@"row>>id %i, name %@",_id,name); 

char生成nsstring的时候做一次显式的编码。问题解决:

image

这说明:

写入数据库,用char的方式没有问题,写入数据库的编码是对的;

从库中取出,可能默认使用ascii解码,造成显示乱码。

使用sqlite c api,要经常参考官方函数文档:http://www.sqlite.org/c3ref/funclist.html

原创粉丝点击