在iOS中使用sqlite3,首先要添加库文件libsqlite3.dylib和导入主头文件
创建或打开数据库
// path为:~/Documents/person.db
sqlite3 *db = NULL;
int result = sqlite3_open([path UTF8String],&db);
代码解析:
sqlite3_open()将根据文件路径打开数据库,如果不存在,则会创建一个新的数据库。如果result等于常量sqlITE_OK,则表示成功打开数据库
sqlite3 *db:一个打开的数据库实例
数据库文件的路径必须以C字符串(而非NSString)传入
执行不返回数据的sql语句
执行创表语句
char *errorMsg = NULL; // 用来存储错误信息
char *sql = "create table if not exists t_person(id integer primary key autoincrement,name text,age integer);";
int result = sqlite3_exec(db,sql,NULL,&errorMsg);
代码解析:
sqlite3_exec()可以执行任何sql语句,比如创表、更新、插入和删除操作。但是一般不用它执行查询语句,因为它不会返回查询到的数据
sqlite3_exec()还可以执行的语句:
开启事务:begin transaction;
回滚事务:rollback;
提交事务:commit;
带占位符插入数据
char *sql = "insert into t_person(name,age) values(?,?);";
sqlite3_stmt *stmt;
if (sqlite3_prepare_v2(db,-1,&stmt,NULL) == sqlITE_OK) {
sqlite3_bind_text(stmt,1,"母鸡",NULL);
sqlite3_bind_int(stmt,2,27);
}
if (sqlite3_step(stmt) != sqlITE_DONE) {
NSLog(@"插入数据错误");
}
sqlite3_finalize(stmt);
代码解析:
sqlite3_prepare_v2()返回值等于sqlITE_OK,说明sql语句已经准备成功,没有语法问题
sqlite3_bind_text():大部分绑定函数都只有3个参数
第1个参数是sqlite3_stmt *类型
第2个参数指占位符的位置,第一个占位符的位置是1,不是0
第3个参数指占位符要绑定的值
第4个参数指在第3个参数中所传递数据的长度,对于C字符串,可以传递-1代替字符串的长度
第5个参数是一个可选的函数回调,一般用于在语句执行后完成内存清理工作
sqlite_step():执行sql语句,返回sqlITE_DONE代表成功执行完毕
sqlite_finalize():销毁sqlite3_stmt *对象
查询数据
char *sql = "select id,name,age from t_person;";
sqlite3_stmt *stmt;
if (sqlite3_prepare_v2(db,NULL) == sqlITE_OK) {
while (sqlite3_step(stmt) == sqlITE_ROW) {
int _id = sqlite3_column_int(stmt,0);
char *_name = (char *)sqlite3_column_text(stmt,1);
NSString *name = [NSString stringWithUTF8String:_name];
int _age = sqlite3_column_int(stmt,2);
NSLog(@"id=%i,name=%@,age=%i",_id,_age);
}
}
sqlite3_finalize(stmt);
代码解析
sqlite3_step()返回sqlITE_ROW代表遍历到一条新记录
sqlite3_column_*()用于获取每个字段对应的值,第2个参数是字段的索引,从0开始
使用实例
// // IWStudentTool.m // 02-sqlite的封装 // // Created by apple on 14-5-22. // #import "IWStudentTool.h" #import "IWStudent.h" #import <sqlite3.h> @implementation IWStudentTool // static的作用:能保证_db这个变量只被IWStudentTool.m直接访问 static sqlite3 *_db; + (void)initialize { // 0.获得沙盒中的数据库文件名 NSString *filename = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) lastObject] stringByAppendingPathComponent:@"student.sqlite"]; // 1.创建(打开)数据库(如果数据库文件不存在,会自动创建) int result = sqlite3_open(filename.UTF8String,&_db); if (result == sqlITE_OK) { NSLog(@"成功打开数据库"); // 2.创表 const char *sql = "create table if not exists t_student (id integer primary key autoincrement,age integer);"; char *errorMesg = NULL; int result = sqlite3_exec(_db,&errorMesg); if (result == sqlITE_OK) { NSLog(@"成功创建t_student表"); } else { NSLog(@"创建t_student表失败:%s",errorMesg); } } else { NSLog(@"打开数据库失败"); } } + (BOOL)addStudent:(IWStudent *)student { NSString *sql = [NSString stringWithFormat:@"insert into t_student (name,age) values('%@',%d);",student.name,student.age]; char *errorMesg = NULL; int result = sqlite3_exec(_db,sql.UTF8String,&errorMesg); return result == sqlITE_OK; } + (NSArray *)students { // 0.定义数组 NSMutableArray *students = nil; // 1.定义sql语句 const char *sql = "select id,age from t_student;"; // 2.定义一个stmt存放结果集 sqlite3_stmt *stmt = NULL; // 3.检测sql语句的合法性 int result = sqlite3_prepare_v2(_db,NULL); if (result == sqlITE_OK) { NSLog(@"查询语句是合法的"); students = [NSMutableArray array]; // 4.执行sql语句,从结果集中取出数据 while (sqlite3_step(stmt) == sqlITE_ROW) { // 真的查询到一行数据 // 获得这行对应的数据 IWStudent *student = [[IWStudent alloc] init]; // 获得第0列的id student.ID = sqlite3_column_int(stmt,0); // 获得第1列的name const unsigned char *sname = sqlite3_column_text(stmt,1); student.name = [NSString stringWithUTF8String:(const char *)sname]; // 获得第2列的age student.age = sqlite3_column_int(stmt,2); // 添加到数组 [students addObject:student]; } } else { NSLog(@"查询语句非合法"); } return students; } + (NSArray *)studentsWithCondition:(NSString *)condition { // 0.定义数组 NSMutableArray *students = nil; // 1.定义sql语句 const char *sql = "select id,age from t_student where name like ?;"; // 2.定义一个stmt存放结果集 sqlite3_stmt *stmt = NULL; // 3.检测sql语句的合法性 int result = sqlite3_prepare_v2(_db,NULL); if (result == sqlITE_OK) { NSLog(@"查询语句是合法的"); students = [NSMutableArray array]; // 填补占位符的内容 NSString *newCondition = [NSString stringWithFormat:@"%%%@%%",condition]; // NSLog(@"%@",newCondition); sqlite3_bind_text(stmt,newCondition.UTF8String,NULL); // 4.执行sql语句,从结果集中取出数据 while (sqlite3_step(stmt) == sqlITE_ROW) { // 真的查询到一行数据 // 获得这行对应的数据 IWStudent *student = [[IWStudent alloc] init]; // 获得第0列的id student.ID = sqlite3_column_int(stmt,2); // 添加到数组 [students addObject:student]; } } else { NSLog(@"查询语句非合法"); } return students; } @end原文链接:https://www.f2er.com/sqlite/199973.html