iOS数据处理之SQLite数据库

发表于:2016-5-26 10:18

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:仗剑走天下    来源:51Testing软件测试网采编

分享:
  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);
22/2<12
重磅发布,2022软件测试行业现状调查报告~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计

法律顾问:上海漕溪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2023
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号