上一篇介绍了coreData的简单使用,这一次是对SQLite的使用。这两者的不同之处就是SQLite需要添加数据库编写语句,很麻烦。
一、步骤
使用SQLite数据库步骤如下:
二、代码实现
1 //定义静态变量 static sqlite3 *_sql;
1 //1.打开数据库 2 //1.1 获取沙盒中数据库文件的文件路径 3 NSString *filePath = [NSHomeDirectory() stringByAppendingFormat:@"/Documents/sql.db"]; 4 NSLog(@"%@",filePath); 5 //1.2 执行打开(创建)数据库的方法 (如果目录下没有数据库文件 会自动创建) 6 /* 7 1.打开数据库 8 int sqlite3_open( 9 const char *filename, // 数据库的文件路径 10 sqlite3 **ppDb // 数据库实例 11 ); 12 */ 13 int result = sqlite3_open([filePath UTF8String], &_sql); 14 //判断是否存在,存在就打开,而不是重新创建 15 //result:int 类型 执行打开(创建)数据库的方法返回的参数 16 //SQLITE_OK = 0 枚举类型 创建/打开数据库方法(SQL语句)执行的状态 17 if (result == SQLITE_OK) { 18 NSLog(@"打开数据库成功!"); 19 //2.建立表格 20 //初始化SQL语句 21 const char *sql = " create table if not exists t_student (id integer primary key autoincrement, name text, age integer, score real); "; 22 //传入执行错误的参数 23 char *error = NULL; 24 //执行创建表格的方法 25 /* 26 2.执行任何SQL语句 27 int sqlite3_exec( 28 sqlite3*, // 一个打开的数据库实例 29 const char *sql, // 需要执行的SQL语句 30 int (*callback)(void*,int,char**,char**), // SQL语句执行完毕后的回调 31 void *, // 回调函数的第1个参数 32 char **errmsg // 错误信息 33 ); 34 */ 35 int result = sqlite3_exec(_sql, sql, NULL, NULL, &error); 36 if (result == SQLITE_OK) { 37 NSLog(@"创建表格成功!"); 38 }else { 39 NSLog(@"创建表格失败!"); 40 } 41 }else { 42 NSLog(@"打开数据库失败!"); 43 }
当执行完毕这一句代码的时候就会创建出数据库--int result = sqlite3_open([filePath UTF8String], &_sql);读者应该注意注释部分的解释,很重要,在这里不一一赘述。
复制地址,找到文件并打开文件(使用Navicat Premium软件)
三、添加数据。
在数据库中循环写入了5条数据。
1 //添加数据 2 - (IBAction)insert { 3 int i; 4 for (i = 1; i <= 5; i ++) { 5 int index = i; 6 NSString *name = [NSString stringWithFormat:@"小明%d",index]; 7 //年龄、分数设置为随机 8 int age = arc4random()%100; 9 float score = arc4random()%100; 10 //SQL语句 11 NSString *sql = [NSString stringWithFormat:@"insert into t_student (name, age, score) values ('%@', %d, %.2f);\n",name, age, score]; 12 char *error = NULL; 13 // 14 int result = sqlite3_exec(_sql, [sql UTF8String], NULL, NULL, &error); 15 if (result == SQLITE_OK) { 16 NSLog(@"添加数据成功!"); 17 }else { 18 NSLog(@"添加数据失败!"); 19 } 20 } 21 i = 1; 22 }
四、删除数据
从数据库中删除数据,可以全部删除,也可以有选择行的删除。
1 //删除全部数据 2 // NSString *sql = [NSString stringWithFormat:@"delete from t_student;"]; 3 //删除选择的数据,需要清楚的知道选择的数据 4 NSString *sql = [NSString stringWithFormat:@"delete from t_student where name = '小明3'; "]; 5 char *error = NULL; 6 int result = sqlite3_exec(_sql, [sql UTF8String], NULL, NULL, &error); 7 if (result == SQLITE_OK) { 8 NSLog(@"删除数据成功!"); 9 }else { 10 NSLog(@"删除数据失败!"); 11 } 12 }
五、更新数据(修改)
1 //更新数据 2 - (IBAction)upData { 3 NSString *sql = [NSString stringWithFormat:@"update t_student set name = '小虎' where name = '小明1' "]; 4 char *error = NULL; 5 //执行SQL语句 6 int result = sqlite3_exec(_sql, [sql UTF8String], NULL, NULL, &error); 7 if (result == SQLITE_OK) { 8 NSLog(@"更新数据成功!"); 9 }else { 10 NSLog(@"更新数据失败!"); 11 } 12 }
六、查询数据
其实,思考一下,无论是修改、删除都需要查询数据。
1 //查询数据 2 - (IBAction)query { 3 //使用占位符 stmt, 4 NSString *sql = [NSString stringWithFormat:@" select * from t_student where name = ?; "]; 5 //2.定义一个存放集 6 sqlite3_stmt *stmt = nil; 7 //错误查询 8 const char *error = NULL; 9 //3.检测SQL语句的合法性,并将stmt 和 我们构造的sql语句进行了绑定,通过stmt可以填充SQL语句 10 //验证sql语句是否正确 11 /** 12 *参数1:数据库指针, 13 *参数2:sql语句 14 *参数3:sql语句的长度写成-1,自动计算sql语句的最大长度,否则要自己计算长度 15 *参数4:sql语句的管理指针 16 *参数5:预留参数,未来使用 17 */ 18 int result = sqlite3_prepare_v2(_sql, [sql UTF8String], -1, &stmt, &error); 19 if (result == SQLITE_OK) { 20 //参数1:sql语句管理指针 21 //参数2:上面sql语句中 ?的位置,?的下标从1开始 22 //参数3:要绑定的数据 23 //参数4:数据的长度 24 sqlite3_bind_text(stmt, 1, "小明4", -1, NULL); 25 // //绑定字段 26 // sqlite3_bind_int(stmt, 2, 22); 27 // sqlite3_bind_int(stmt, 3, 98); 28 //执行SQL语句 29 int result = sqlite3_step(stmt); 30 31 if (result == SQLITE_ROW) {//如果查询到某一行数据,就会返回SQLITE_ROW 32 int age = sqlite3_column_int(stmt, 2); 33 NSLog(@"查询成功"); 34 NSLog(@"%d",age); 35 } 36 } 37 }
1. 检测SQL语句的合法性,并将stmt 和 我们构造的sql语句进行了绑定,通过stmt可以填充SQL语句
sqlite3_prepare_v2(<#sqlite3 *db#>, <#const char *zSql#>, <#int nByte#>, <#sqlite3_stmt **ppStmt#>, <#const char **pzTail#>)
2. 执行SQL语句
sqlite3_exec(<#sqlite3 *#>, <#const char *sql#>, <#int (*callback)(void *, int, char **, char **)#>, <#void *#>, <#char **errmsg#>)
3. 绑定字段
sqlite3_bind_int(<#sqlite3_stmt *#>, <#int#>, <#int#>)
sqlite3_bind_text(<#sqlite3_stmt *#>, <#int#>, <#const char *#>, <#int n#>, <#void (*)(void *)#>)
sqlite3_bind_double(<#sqlite3_stmt *#>, <#int#>, <#double#>)
效果图如下:
当使用完数据库之后,要关闭数据库。这里没有关闭。
文章是作者原著,如若转载,请标明出处。欢迎各位来喷。