专业java、php、iOS、C++、网页设计、平面设计、网络营销、游戏开发、前端与移动开发培训机构
代码查询数据
sqlite3_exec
值返回一个int值,而查询数据需要返回记录,一条记录可能有多个字段.因此sqlite3_exec
无法返回查询结果.- 准备SQL语句,获取
prepared_statement
准备语句对象 在
SQLiteManager.m
中添加查询语句/** * 执行查询 * @param sql 查询的sql语句 */ - (void)execQuery:(NSString *)sql { sqlite3_stmt *stmt = NULL; // sqlite3 *db: 数据库指针 // const char *zSql: 查询的sql语句 // int nByte: 查询sql语句的长度, -1整个SQL的长度 // sqlite3_stmt **ppStmt: 准备好之后返回的对象 // const char **pzTail: 没有执行的sql语句 int result = sqlite3_prepare_v2(_db, sql.UTF8String, -1, &stmt, NULL); if (result == SQLITE_OK) { while (sqlite3_step(stmt) == SQLITE_ROW) { // 将stmt指向下一行数据 // 有一行数据 const unsigned char *cName = sqlite3_column_text(stmt, 0); NSString *name = [NSString stringWithCString:(const char *)cName encoding:NSUTF8StringEncoding]; // stmt: 准备好的对象 iCol: 要获取第几行的数据 int age = sqlite3_column_int(stmt, 1); double height = sqlite3_column_double(stmt, 2); NSLog(@"name: %@, age: %zd, height: %f", name, age, height); } } }
- 在
ViewController.m
中添加testManyInsert
方法/** * 测试查询数据 */ - (void)testQuery { NSString *sql = @"SELECT name, age, height FROM T_Person LIMIT 30;"; [[SQLiteManager sharedManager] execQuery:sql]; }
- 代码小结
sqlite3_prepare_v2
这一部分的工作可以看作是对字符串的 SQL 语句进行编译,并且检查是否存在语法问题- 编译成功后通过
sqlite3_step
执行 SQL,每执行一次,获取一条记录 - 通过
while
循环直至执行完毕 - 注意,指令执行完毕后需要释放