Sqlite   发布时间:2022-05-22  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了SQLite3的各个函数(全)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

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

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

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

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

Undefined symbols:
"_sqlite3_open",referenced from:

加入库的方法是:

选择sqlite库:

选择完的效果:

下面是代码:

//sqlite 常用语句

  1. [selfopenDataBase];
  2. [selfcreatetable];
  3. [selfinserttable];
  4. [selfquerytable];
  5. [selfdeletetable];
  6. [selfquerytable];

实现:

//opendatabase

  1. -(voID)openDataBase
  2. {
  3. NSArray*documentsPaths=NSSearchPathForDirectorIEsInDomains(NSdocumentDirectory,NSUserDomainMask,YES);
  4. NsString*databasefilePath=[[documentsPathsobjectATindex:0]StringByAppendingPathComponent:@"db.sql"];
  5. if(sqlite3_open([databasefilePathUTF8String],&database)==@R_755_5607@OK)
  6. {
  7. NSLog(@"opensqlitedbok.");
  8. }
  9. else
  10. {
  11. NSLog(@"cAnnotopensqlitedb");
  12. //closedatabase
  13. sqlite3_close(database);
  14. }
  15. }

//createtable

  1. -(voID)createtable
  2. {
  3. char*errorMsg;
  4. constchar*createsql="createtableifnotexistspersons(IDIntegerprimaryKeyautoincrement,nametext)";
  5. if(sqlite3_exec(database,createsql,NulL,&errorMsg)==@R_755_5607@OK)
  6. {
  7. NSLog(@"createok.");
  8. }
  9. else
  10. {
  11. NSLog(@"cAnnotcreatetable");
  12. [selfErrorReport:(NsString*)createsql];
  13. }
  14. }

//inserttable

  1. -(voID)inserttable
  2. {
  3. char*errorMsg;
  4. constchar*insertsql="inserTintopersons(NAME)values('田周辉')";
  5. if(sqlite3_exec(database,insertsql,&errorMsg)==@R_755_5607@OK)
  6. {
  7. NSLog(@"insertok.");
  8. }
  9. else
  10. {
  11. NSLog(@"cAnnoTinsertit@R_644_10586@ble");
  12. [selfErrorReport:(NsString*)insertsql];
  13. }
  14. }

//error

  1. -(voID)ErrorReport:(NsString*)item
  2. {
  3. char*errorMsg;
  4. if(sqlite3_exec(database,(constchar*)item,&errorMsg)==@R_755_5607@OK)
  5. {
  6. NSLog(@"%@ok.",item);
  7. }
  8. else
  9. {
  10. NSLog(@"error:%s",errorMsg);
  11. sqlite3_free(errorMsg);
  12. }
  13. }

//query

  • -(voID)querytable
  • {
  • constchar*SELEctsql="SELEctID,namefrompersons";
  • sqlite3_stmt*statement;
  • if(sqlite3_prepare_v2(database,SELEctsql,-1,&statement,nil)==@R_755_5607@OK)
  • {
  • NSLog(@"SELEctok.");
  • while(sqlite3_step(statement)==@R_755_5607@ROW)//@R_755_5607@OK@R_755_5607@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);
  • }
  • @H_46_618@//delete

  • -(voID)deletetable
  • {
  • char*errorMsg;
  • [selfopenDataBase];
  • constchar*sql="deletEFROMpersonswherEID=24";
  • if(sqlite3_exec(database,sql,&errorMsg)==@R_755_5607@OK)
  • {
  • NSLog(@"deleteok.");
  • }
  • else
  • {
  • NSLog(@"cAnnotdeleteit");
  • [selfErrorReport:(NsString*)sql];
  • }
  • }
  • 命令行:

    sqlite3database//创建数据库
    1. cratetabletablefile(IDsmallint,file_namevarchar(256),up_statesmallint,file_sizesmallint);//创建一个表格
    2. insertintotablefilevalues(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//关闭数据库
    sourcecode
    1. -(ID)lookupSingularsQL:(NsString*)sqlforType:(NsString*)rettype{
    2. sqlite3_stmt*statement;
    3. IDresult;
    4. if(statement=[selfprepare:sql]){
    5. if(sqlite3_step(statement)==@R_755_5607@ROW){
    6. if([rettypecompare:@"text"]==NSorderedSamE){
    7. chartemp_buf[256];
    8. @H_782_9@memset(temp_buf,256);
    9. sprintf(temp_buf,"%s%s%s%s",(char*)sqlite3_column_text(statement,0),(char*)sqlite3_column_text(statement,1),
    10. (char*)sqlite3_column_text(statement,2),3));
    11. result=[NsStringStringWithUTF8String:temp_buf];
    12. //result=[NsStringStringWithUTF8String:(char*)sqlite3_column_text(statement,0)];
    13. }elseif([rettypecompare:@"Integer"]==NSorderedSamE){
    14. result=(ID)sqlite3_column_int(statement,0);
    15. }
    16. }
    17. }
    18. sqlite3_finalize(statement);
    19. returnresult;
    20. }

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

    1. @interfaceDetailVIEwController:UIVIEwController{
    2. UIPopoverController*popoverController;
    3. UIToolbar*toolbar;
    4. IDdetailitem;
    5. UILabel*detailDescriptionLabel;
    6. sqlite3*database;

    打开数据库

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

    1. NSArray*documentsPaths=NSSearchPathForDirectorIEsInDomains(NSdocumentDirectory,YES);
    2. NsString*databasefilePath=[[documentsPathsobjectATindex:0]StringByAppendingPathComponent:@"mydb"];
    3. if(sqlite3_open([databasefilePathUTF8String],&database)==@R_755_5607@OK)
    4. {
    5. NSLog(@"opensqlitedbok.");
    6. }

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

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

    关闭数据库

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

    1. -(voID)vIEwDIDUnload{
    2. //ReleaseanyretainedsubvIEwsofthemainvIEw.
    3. //e.g.self.myOutlet=nil;
    4. sqlite3_close(database);
    5. self.popoverController=nil;
    6. }

    建表语句

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

    1. char*errorMsg;
    2. constchar*createsql="createtableifnotexistspersons(IDIntegerprimaryKeyautoincrement,nametext)";
    3. if(sqlite3_exec(database,&errorMsg)==@R_755_5607@OK){
    4. NSLog(@"createok.");
    5. }

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

    向表中插入记录

    建表语句类似:

    1. constchar*insertsql="inserTintopersons(NAME)values(‘张三’)";
    2. if(sqlite3_exec(database,&errorMsg)==@R_755_5607@OK){
    3. NSLog(@"insertok.");
    4. }

    错误信息的处理

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

    1. if(sqlite3_exec(database,&errorMsg)==@R_755_5607@OK){
    2. NSLog(@"createok.");
    3. }else{
    4. NSLog(@"error:%s",errorMsg);
    5. sqlite3_free(errorMsg);
    6. }

    查询结果集

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

    1. constchar*SELEctsql="SELEctID,namefrompersons";
    2. sqlite3_stmt*statement;
    3. if(sqlite3_prepare_v2(database,nil)==@R_755_5607@OK){
    4. NSLog(@"SELEctok.");
    5. }
    6. while(sqlite3_step(statement)==@R_755_5607@ROW){
    7. int_ID=sqlite3_column_int(statement,0);
    8. char*name=(char*)sqlite3_column_text(statement,1);
    9. NSLog(@"row>>ID%i,name%s",name);
    10. }
    11. sqlite3_finalize(statement);

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

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

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

    1. while(sqlite3_step(statement)==@R_755_5607@ROW){
    2. int_ID=sqlite3_column_int(statement,0);
    3. NsString*name=[[NsStringalloc]initWithCString:(char*)sqlite3_column_text(statement,1)enCoding:NSUTF8StringEnCoding];
    4. NSLog(@"row>>ID%i,name%@",name);
    5. }

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

    这说明:

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

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

    @R_616_7251@te c API,要经常参官方函数文档:http://www.sqlite.org/c3ref/funcList.HTML

    大佬总结

    以上是大佬教程为你收集整理的SQLite3的各个函数(全)全部内容,希望文章能够帮你解决SQLite3的各个函数(全)所遇到的程序开发问题。

    如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

    本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
    如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
    标签:首先