专业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 循环直至执行完毕
    • 注意,指令执行完毕后需要释放

results matching ""

    No results matching ""