4> SQLite语法
创建或打开数据库
sqlite3_open() 将根据文件路径打开数据库,如果不存在,则会创建一个新的数据库。如果result 等于常量 SQLITE_OK,则表示成功打开数据库。
sqlite3 *db; db 一个打开的数据库实例。
数据库文件的路径必须以 C语言字符串(而非NSString)传入。
1 // 打开数据库,很多地方都会使用到数据库,所以初始化一个数据库的静态变量(句柄) 2 static sqlite3 *db = nil; 3 4 // 打开数据库,使用int去接收打开的结果 5 // 第一个参数:self.dbPath代表数据库的存储路径 6 // 第二个参数:二级指针,数据库的地址(句柄) 7 8 int result = sqlite3_open([self.dbPath UTF8String], &db); 9 10 // result是一个枚举值,有很多种情况 11 if (result == SQLITE_OK) { 12 NSLog(@"数据库打开成功"); 13 } else { 14 NSLog(@"数据库打开失败"); 15 } |
关闭数据库:sqlite3_close(db);
1 int result = sqlite3_close(db);
2
3 if (result == SQLITE_OK) {
4 NSLog(@"数据库关闭成功");
5 } else {
6 NSLog(@"数据库关闭失败");
7 }
执行sql语句
sqlite3_exec() 可以执行任何SQL语句,比如创表、更新、插入和删除操作。但是一般不用它执行查询语句,因为它不会返回查询到的数据
预执行
方法使用及参数说明见代码
创建表
1 // 创建一个Person表,字段:uid integer类型主键 自增 不能为空,name text类型,gender text类型,age integer类型 2 NSString *createStr = @"create table if not exists person(uid integer primary key autoincrement not null, name text, gender text, age integer)"; 3 /* 4 int SQLITE_STDCALL sqlite3_exec( 5 sqlite3*, 6 const char *sql, 7 int (*callback)(void*,int,char**,char**), 8 void *, 9 char **errmsg 10 ); 11 */ 12 13 // 第一个参数:数据库 14 // 第一个参数:sql语句,需要进行编码 15 // 第一个参数:结果回调的一个函数 16 // 第一个参数:回调函数的一个参数 17 // 第一个参数:错误信息 18 int result = sqlite3_exec(db, [createStr UTF8String], NULL, NULL, NULL); 19 20 if (result == SQLITE_OK) { 21 NSLog(@"创建表成功"); 22 } else { 23 NSLog(@"创建表失败"); 24 } |
插入数据
1 // 当values不确定的情况下使用问号(?)代替,之后会进行值绑定的过程 2 NSString *insertStr = @"insert into person(name, gender, age) values(?, ?, ?)"; 3 4 // 伴随指针 5 sqlite3_stmt *stmt = NULL; 6 7 // 预执行语句 8 9 /* 10 int SQLITE_STDCALL sqlite3_prepare( 11 sqlite3 *db, 12 const char *zSql, 13 int nByte, 14 sqlite3_stmt **ppStmt, 15 const char **pzTail 16 ); 17 */ 18 // 第一个参数db:数据库 19 // 第二个参数zSql:sql语句 20 // 第三个参数nByte:有正、负之分,例如:1,表示只往后一个字节;如果为负数,遇到特殊符号(\000,u000)才会结束读取 21 // 第四个参数pzTail:是伴随指针,需要自己进行创建,会随着数据库的相关操作确定其中问号(?)的值 22 // 第五个参数ppStmt:取值的时候取不全,剩下的值就都存在这里 23 int result = sqlite3_prepare(db, [insertStr UTF8String], -1, &stmt, NULL); 24 25 if (result == SQLITE_OK) { 26 27 // 操作成功的方法里进行问号(?)值的一些绑定设置 28 29 // 第一个参数:伴随指针 30 // 第二个参数:? 的位置,从1开始 31 // 第三个参数:表示要插入的值 32 // 第四个参数:有正、负之分,例如:1,表示只往后一个字节;如果为负数,遇到特殊符号(\000,u000)才会结束读取 33 // 第五个参数:回调函数 34 sqlite3_bind_text(stmt, 1, [name UTF8String], -1, NULL); 35 sqlite3_bind_text(stmt, 2, [gender UTF8String], -1, NULL); 36 sqlite3_bind_int64(stmt, 3, age); 37 38 // sql语句执行完毕 39 // 执行伴随指针,根据伴随指针的执行情况来判断是否插入成功[SQLITE_DONE代表伴随指针执行成功] 40 if (sqlite3_step(stmt) == SQLITE_DONE) { 41 NSLog(@"插入成功"); 42 } else { 43 NSLog(@"插入失败"); 44 } 45 46 } else { 47 NSLog(@"result = %d", result); 48 } 49 // 一定要释放伴随指针 50 sqlite3_finalize(stmt); |
更新数据
1 NSString *updateStr = @"update person set name = '悟空' where uid = ?"; 2 3 sqlite3_stmt *stmt = NULL; 4 5 int result = sqlite3_prepare(db, updateStr.UTF8String, -1, &stmt, NULL); 6 7 if (result == SQLITE_OK) { 8 sqlite3_bind_int64(stmt, 1, uid); 9 10 if (sqlite3_step(stmt) == SQLITE_DONE) { 11 NSLog(@"更新数据成功"); 12 } else { 13 NSLog(@"更新数据失败"); 14 } 15 16 } else { 17 NSLog(@"result = %d", result); 18 } 19 sqlite3_finalize(stmt); |
删除数据
1 NSString *deleteStr = @"delete from person where uid = ?"; 2 3 sqlite3_stmt *stmt = NULL; 4 5 int result = sqlite3_prepare(db, deleteStr.UTF8String, -1, &stmt, NULL); 6 7 if (result == SQLITE_OK) { 8 sqlite3_bind_int64(stmt, 1, uid); 9 10 if (sqlite3_step(stmt) == SQLITE_DONE) { 11 NSLog(@"删除成功"); 12 } else { 13 NSLog(@"删除失败"); 14 } 15 16 } else { 17 NSLog(@"result = %d", result); 18 } 19 sqlite3_finalize(stmt); |
查找所有数据
1 NSString *selectStr = @"select * from person"; 2 3 sqlite3_stmt *stmt = NULL; 4 5 int result = sqlite3_prepare(db, selectStr.UTF8String, -1, &stmt, NULL); 6 7 if (result == SQLITE_OK) { 8 // 查找数据的时候当不知道有多少次的时候使用while循环 9 // sqlite3_step(stmt) == SQLITE_ROW 代表逐行执行数据 10 while (sqlite3_step(stmt) == SQLITE_ROW) { 11 // 第一个参数:伴随指针 12 // 第二个参数:代表这个字段的位置【只有带问号的是从1开始,其余所有都是从0开始】 13 int uid = sqlite3_column_int(stmt, 0); 14 NSLog(@"uid = %d", uid); 15 16 // 在OC代码中,要使用C语言的相关内容,应该使用utf-8 17 NSString *name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)]; 18 NSLog(@"name = %@", name); 19 20 NSString *gender = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 2)]; 21 NSLog(@"gender = %@", gender); 22 23 int age = sqlite3_column_int(stmt, 3); 24 NSLog(@"age = %d ***************", age); 25 } 26 27 } else { 28 NSLog(@"result = %d", result); 29 } 30 sqlite3_finalize(stmt); |