IOS---SQLite3使用sql
iPhone中支持经过sqlite3来访问本地数据库,SQLite是MySQL精简版,但无需服务器就能运行,它有两个限制:一是必须手动去建立,二是没有面向对象的接口。它的具体用法以下:数据库
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的数据表,其包含两个字段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,信息成功保存到数据库中。
断点执行,在此处能够看到输入的信息: