下面是代码: //sqlite [selfopenDataBase]; //[selfcreatetable]; //[selfinserttable]; [selfquerytable]; [selfdeletetable]; [selfquerytable];
实现:
//opendatabase -(voID)openDataBase { NSArray*documentsPaths=NSSearchPathForDirectorIEsInDomains(NSdocumentDirectory ,NSUserDomainMask ,YES); Nsstring*databasefilePath=[[documentsPathsobjectAtIndex:0]stringByAppendingPathComponent:@"db.sql"]; if(sqlite3_open([databasefilePathUTF8String],&database)==sqlITE_OK) { NSLog(@"opensqlitedbok."); } else { NSLog(@"cannotopensqlitedb"); //closedatabase sqlite3_close(database); } } //createtable -(voID)createtable { char*errorMsg; constchar*createsql="createtableifnotexistspersons(IDintegerprimarykeyautoincrement,nametext)"; if(sqlite3_exec(database,createsql,NulL,&errorMsg)==sqlITE_OK) { NSLog(@"createok."); } else { NSLog(@"cannotcreatetable"); [selfErrorReport:(Nsstring*)createsql]; } } //inserttable -(voID)inserttable { char*errorMsg; constchar*insertsql="insertintopersons(name)values('田周辉')"; if(sqlite3_exec({ NSLog(@"insertok."); } else { NSLog(@"cannotinsertittotable"); [selfErrorReport:(Nsstring*)insertsql]; } } //error -(voID)ErrorReport:(Nsstring*)item { char*errorMsg; if(sqlite3_exec(char*)item,&errorMsg)==sqlITE_OK) { NSLog(@"%@ok.",item); } else { NSLog(@"error:%s",errorMsg); sqlite3_free(errorMsg); } } //querytable -(voID)querytable { constchar*selectsql="selectID,namefrompersons"; sqlite3_stmt*statement; if(sqlite3_prepare_v2({ NSLog(@"selectok."); while(sqlite3_step(statement)==sqlITE_ROW)//sqlITE_OKsqlITE_ROW { int_ID=sqlite3_column_int(statement,0); Nsstring*name=[[Nsstringalloc]initWithCString:(char*)sqlite3_column_text(statement,1)enCoding:NSUTF8StringEnCoding]; NSLog(@"row>>ID%i,name>>%@",_ID,name); } } else { //error [selfErrorReport:(Nsstring*)selectsql]; } sqlite3_finalize(statement); } //deletetable -(voID)deletetable { char*errorMsg; [selfopenDataBase]; constchar*sql="DELETEFROMpersonswhereID=24"; if(sqlite3_exec({ NSLog(@"deleteok."); } else { NSLog(@"cannotdeleteit"); [selfErrorReport:(Nsstring*)sql]; } } 命令行:
sqlite3database//创建数据库 cratetabletablefile(IDsmallint,file_namevarchar(256),up_statesmallint);//创建一个表格 intotablefilevalues(1,"200110101.rcu",100,4500);//插入数据 5如何访问sqlite3数据库 sqlite3_open//打开数据库 sqlite3_prepare//将UTF-8格式的SQL语句转换为指向已备语句的指针 sqlite3_column_string//返回某一行的字符串 sqlite3_finalize//删除一条已备语句 sqlite3_close//关闭数据库 6sourcecode -(ID)lookupSingularsQL:(Nsstring*)sqlforType:(Nsstring*)rettype{ sqlite3_stmt*statement; IDresult; if(statement=[selfprepare:sql]){ if(sqlite3_step(statement)==sqlITE_ROW){ if([rettypecompare:@"text"]==NSOrderedSame){ chartemp_buf[256]; memset(temp_buf,256); sprintf(temp_buf,"%s%s%s%s", ( ); result=[NsstringstringWithUTF8String:temp_buf]; //result=[NsstringstringWithUTF8String:( }elseif([rettypecompare:@"integer"]==NSOrderedSame){ result=(ID)sqlite3_column_int(statement,0); } } } sqlite3_finalize(statement); returnresult; } 应该有个成员变量,比如我的代码:
@interfaceDetailVIEwController:UIVIEwController{ UIPopoverController*popoverController; UIToolbar*toolbar; IDdetailitem; UILabel*detailDescriptionLabel; sqlite3*database; 打开数据库
sqlite数据库是文件数据库,是保存在文件系统中的。因此需要知道文件保存到哪里,可参见iOS中对文件的 *** 作。比如本文保存到documents目录下。代码:
NSArray*documentsPaths=NSSearchPathForDirectorIEsInDomains(NSdocumentDirectory ,NSUserDomainMask ,YES); Nsstring*databasefilePath=[[documentsPathsobjectAtIndex:0]stringByAppendingPathComponent:@"mydb"]; if(sqlite3_open([databasefilePathUTF8String],153); background-color:inherit; Font-weight:bold">database)==sqlITE_OK){ NSLog(@"opensqlitedbok."); } 通过ssh查看documents目录,发现mydb文件已经创建。sqlite的策略是如果有该文件就打开,如果没有就创建文件,也就是创建数据库。
这里要注意,使用的是C语法,sqlite3_open传入的是database的地址。
关闭数据库
数据库使用完毕后,要关闭,比如退出应用的时候:
-(voID)vIEwDIDUnload{ //ReleaseanyretainedsubvIEwsofthemainvIEw. //e.g.self.myOutlet=nil; sqlite3_close(database); self.popoverController=nil; } 建表语句
数据库打开以后,如果没有表,建表:
; if(sqlite3_exec(NSLog(@"createok."); }
这里要特别注意errorMsg传的是地址,因为该函数要通过地址引用来写报错字符信息。
向表中插入记录
和建表语句类似:
constchar*insertsql="insertintopersons(name)values(‘张三’)"; if(sqlite3_exec(NSLog(@"insertok."); }
错误信息的处理
如果在多个地方使用errorMsg,那么每次使用完毕要清空一下字串,比如这样:
if(sqlite3_exec(NSLog(@"createok."); }else{ NSLog(@"error:%s",errorMsg); sqlite3_free(errorMsg); } 查询结果集
结果集的查询,需要用到statement:
; sqlite3_stmt*statement; if(sqlite3_prepare_v2(NSLog(@"selectok."); } while(sqlite3_step(statement)==sqlITE_ROW){ char*name=(NSLog(@"row>>ID%i,name%s",153); background-color:inherit; Font-weight:bold">name); } sqlite3_finalize(statement); 不过这里有个问题,看看打印的日志:
乱码。因为直接用的char类型来做的。 解决办法是,用nsstring替代char:
while(sqlite3_step(statement)==sqlITE_ROW){ Nsstring*NSLog(@"row>>ID%i,name%@",153); background-color:inherit; Font-weight:bold">name); } char生成nsstring的时候做一次显式的编码。问题解决:
这说明: 写入数据库,用char的方式没有问题,写入数据库的编码是对的;
从库中取出,可能默认使用ascii解码,造成显示乱码。
使用sqlite c API,要经常参考官方函数文档:http://www.sqlite.org/c3ref/funcList.HTML
总结 以上是内存溢出为你收集整理的sqlite 在 ios 开发的使用(基础)全部内容,希望文章能够帮你解决sqlite 在 ios 开发的使用(基础)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
赞
(0)打赏
微信扫一扫
支付宝扫一扫
评论列表(0条)