IOS---SQLite3使用

IOS---SQLite3使用sql


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

1.添加开发包libsqlite3.0.dylib服务器

           

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

以后在代码中导入sqlite3.h头文件函数

#import<sqlite3.h>lua

2.具体代码操做:spa

2.1设置数据库文件名.net

#define KFileName @”database”指针

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

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"otherButtonTitles: nil];

       [alert show];

   }

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

视图以下:


                         

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

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

   

文档部份内容参考iPhone实战操做SQLite地址:http://m.oschina.net/blog/65294

相关文章
相关标签/搜索