IOS---SQLite3使用

IOS---SQLite3使用


iPhone中支持通过sqlite3来访问本地数据库,SQLiteMySQL精简版,但无需服务器就能运行,它有两个限制:一是必须手动去创建,二是没有面向对象的接口。它的具体用法如下:

1.添加开发包libsqlite3.0.dylib

            IOS---SQLite3使用

在自己新建的项目下,选择Bulid Phases  à Link Binary With Libraries(4 items) à “+” à  libsqlite3.0.dylib  à Add ,添加成功。

之后在代码中导入sqlite3.h头文件

#import<sqlite3.h>

2.具体代码操作:

2.1设置数据库文件名

#define KFileName @”database”

  2.2.获取数据库文件的地址

NSArray*path=NSSearchPathForDirectoriesInDomains(NSDocumentDirector,NSUserDomainMask,YES);

NSString *dataBaseFilePath=[path objectAtIndex:0];

NSString *dataBasePath=[dataBaseFilePath stringByAppendingPathCompoment: KFileName];

NSLog(@”dataBasePath==%@”,dataBasePath);

  2.3.打开数据库和关闭数据库

导入库和头文件之后,接下来的操作就是打开一个数据库。这时候需要调用sqlite3_open这个函数来对打开一个数据库文件。此函数声明如下:


int sqlite3_open(

 const char *filename,   /* Database filename (UTF-8) */

 sqlite3 **ppDb          /* OUT: SQLite db handle */

);

其中第一个参数就是数据库所存放的路径,如果路径下没有数据库文件则系统会在此路径下创建一个数据库。至于第二个参数则是数据库的句柄引用,但此函数调用成功后此句柄将会保存打开数据库的句柄,此句柄在往后的数据库操作中需要用到。因此,可如下方式调用:


NSString *dbPath=[NSString stringWithFormat:@”%@/Documents/demo.db”,NSHomeDirectory()];

sqlite3 *database;

if (sqlite3_open([path UTF8String], &database)==SQLITE_OK) {

NSLog(@“open database successfully!”);

}

既然有打开数据库,那么就肯定有关闭数据库的操作了,我们要养成良好的习惯,当需要使用数据库的时候就执行sqlite3_open来打开数据库,等使用完数据库后就调用sqlite3_close函数来对数据库进行关闭。关于sqlite3_close函数声明如下:

int sqlite3_close(sqlite3 *);
关闭时传入数据库句柄即可对数据库进行关闭。调用方式如下:


if(sqlite3_close(database)==SQLITE_OK)

NSLog(@“close database successfully!”);

2.4.对数据库操作

常用的有两种方式可以操作数据库中的数据和调整结构。

第一种就是sqlite3_exec函数,这种方法一般使用在不返回数据集的情况,也就是说少用于查询类的操作。如果使用他来创建表结构、更新、插入或者删除操作是一种直观快捷的方法。先来看看此方法的声明:

int sqlite3_exec(

 sqlite3*,                                  /* An open database */

 const char *sql,                           /* SQL to be evaluated */

 int (*callback)(void*,int,char**,char**),  /* Callback function */

 void *,                                    /* 1st argument to callback */

 char **errmsg                              /* Error msg written here */

);


第一个参数就是打开数据库,第二个参数就是SQL语句,第三个参数为回调方法的函数指针,一旦指定此参数后,当执行语句为查询语句时则在枚举记录集时回对调此方法。第四个参数则为回调的第一个参数引用。至于第五个参数就是如果方法执行后存在异常,那么这个参数保存的就是错误的描述信息。

创建数据表:

数据表是可以包含不同的数据字段,这些字段可以指定不同的数据类型,存储不同的数据。我们建表时可以根据需要进行创建。下面的代码创建了一个叫做INFO的数据表,其包含两个字段userNamepassWord。代码如下所示:

char *errorMsg;

constchar *createsql = "CREATE Table IF NOT EXISTS INFO (userNameVARCHAR(50) PRIMARY KEY ,passWord VARCHAR(50))";

int result=sqlite3_exec(database, createsql, NULL,NULL, &errorMsg);

NSLog(@"%d",result);

if (result!=SQLITE_OK)

       {

sqlite3_close(database);

NSLog(@"create table failed");

returnNO;

       }

else

       {

NSLog(@"create table succeeded");

returnYES;

       }

在建表之前判断表是否存在,若未存在则建表。

第二种就是使用sqlite3_prepare_v2sqlite3_step两个函数搭配的进行操作。其中sqlite3_prepare_v2是一个将SQL语句编译为sqlite内部一个结构体(sqlite3_stmt).该结构体中包含了将要执行的的SQL语句的信息。而sqlite3_step则是让转化后的SQL进行下一步的操作。因此通过这两个函数可以很方便的获取到数据库中的数据。下面是这两个函数的声明:

int sqlite3_prepare_v2(

 sqlite3 *db,            /* Database handle */

 const char *zSql,       /* SQL statement, UTF-8 encoded */

 int nByte,              /* Maximum length of zSql in bytes. */

 sqlite3_stmt **ppStmt,  /* OUT: Statement handle */

 const char **pzTail     /* OUT: Pointer to unused portion of zSql */

);

第一个参数就是打开数据库时的数据库句柄对象。第二个就是SQL语句。第三个参数是用于指定SQL语句最大的长度,如果此参数为负数,则根据第二个参数中的第一个终结符为准作为一条完整的语句。如果为非负数,则以第二个参数的第一个终结符(00u0000)或者指定的数字为准作为一条完整语句。第四个参数则是调用函数后返回的一个结构体,此结构体包含了相关语句的信息。关于第五个参数是用于指向前一条语句结束位置,一旦指定此参数,则参数指向位置的左边语句将不进行编译解析。

判断表是否存在:

sqlite3_stmt*statement;

NSString*sqlIsExistTable=[NSStringstringWithFormat:@"selectcount(*) from DataBase where name='%@'",tableName];

if (sqlite3_prepare_v2(database,[sqlIsExistTable UTF8String],-1,&statement,NULL)!= SQLITE_OK)

   {

       isExist=NO;

   }

int execIsExist=sqlite3_step(statement);

if (execIsExist==SQLITE_ROW)

   {

int count = sqlite3_column_int(statement, 0);

if (count>0) {

          isExist=YES;

NSLog(@"table isexists");

       }

else {

           isExist= NO;

NSLog(@"table don't exist,execIsExist = %d,count =%d",execIsExist,count);

       }

}

在判断表是否存在之前,要判断数据库是否打开。

2.5.数据插入操作

上面的例子创建了一个数据后,可以使用insert语句将数据插入表中:代码如下所示:

if ([selfcreateTable]==YES)

   {

NSString *insertInfo=[NSStringstringWithFormat:@"Insert into INFO (userName,passWord) values('%@','%@')",userNameTextField,pwdTextField];


NSInteger i=[selfexecNoQuery:insertInfo];

if (i>0)

{

UIAlertView *alert=[[UIAlertViewalloc]initWithTitle:nilmessage:@"success to insert "delegate:selfcancelButtonTitle:@"cancel"otherButtonTitlesnil];

       [alert show];

   }

  }    return [NSStringstringWithFormat:@"%@ %@",userNameTextField,pwdTextField];

视图如下:


 IOS---SQLite3使用                        IOS---SQLite3使用

输入信息,点击save后弹出UIAlert,信息成功保存到数据库中。

断点执行,在此处可以看到输入的信息:

    IOS---SQLite3使用


本文转自HDDevTeam 51CTO博客,原文链接:http://blog.51cto.com/hddev/1253719,如需转载请自行联系原作者

上一篇:《云计算:原理与范式》一3.12 SaaS集成设备


下一篇:sqlite3使用简介