sqlite 在 ios 开发的使用(基础)

sqlite 在 ios 开发的使用(基础),第1张

概述SQLite是嵌入式的和轻量级的SQL数据库。SQLite是由C实现的。广泛用于包括浏览器(支持HTML5的大部分浏览器,IE除外)、iOS、Android以及一些便携需求的小型web应用系统。 1 使用原因:存储、检索信息 2 SQLite是MySQL精简版。但无需服务器就能进行。 3 两个限制:1)必须手动创建数据库 2)没有面向对象的接口。 4 如何手动创建数据库。 使用SQLite前的准备

sqlite是嵌入式的和轻量级的sql数据库。sqlite是由C实现的。广泛用于包括浏览器(支持HTML5的大部分浏览器,IE除外)、iOS、AndroID以及一些便携需求的小型web应用系统。

1 使用原因:存储、检索信息

2 sqlite是MysqL精简版。但无需服务器就能进行。

3 两个限制:1)必须手动创建数据库 2)没有面向对象的接口。

4 如何手动创建数据库。

使用sqlite前的准备

使用sqlite是很多做iOS开发中第一次面对C的情况,包括我。因为sqlite是C写的,Objective-C可以直接使用C代码。在sqlite前,一般都会使用Cocoa Touch框架,都是基于Objective-C的。

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

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

@H_301_29@

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

#import "sqlite3.h"
Undefined symbols:
"_sqlite3_open",referenced from: @H_301_29@

加入库的方法是:

或者点击 你的应用程序名,(最上面带图标的那个)中间视图会出现frameworks的图表,左下脚有一个加号,就是添加新的frameworks的地方了,在搜索里输入需要的......,添加进去就OK了!

选择sqlite库:

选择完的效果:

下面是代码:

      //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 开发的使用(基础)所遇到的程序开发问题。

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

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/1175274.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-02
下一篇2022-06-02

发表评论

登录后才能评论

评论列表(0条)