IOS---SQLite3使用
iPhone中支持通过sqlite3来访问本地数据库,SQLite是MySQL精简版,但无需服务器就能运行,它有两个限制:一是必须手动去创建,二是没有面向对象的接口。它的具体用法如下:
1.添加开发包libsqlite3.0.dylib:
在自己新建的项目下,选择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的数据表,其包含两个字段userName和passWord。代码如下所示:
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_v2和sqlite3_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语句最大的长度,如果此参数为负数,则根据第二个参数中的第一个终结符为准作为一条完整的语句。如果为非负数,则以第二个参数的第一个终结符(00或u0000)或者指定的数字为准作为一条完整语句。第四个参数则是调用函数后返回的一个结构体,此结构体包含了相关语句的信息。关于第五个参数是用于指向前一条语句结束位置,一旦指定此参数,则参数指向位置的左边语句将不进行编译解析。
判断表是否存在:
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,信息成功保存到数据库中。
断点执行,在此处可以看到输入的信息:
本文转自HDDevTeam 51CTO博客,原文链接:http://blog.51cto.com/hddev/1253719,如需转载请自行联系原作者