Swift中获取SQLite3查询结果行数的方法
嘿,这个问题我熟!SQLite确实没有sqlite3_row_count这个API,针对SELECT查询的结果行数,咱们有两种靠谱的解决办法,我给你详细说说:
方案1:先执行COUNT(*)查询获取总行数
如果你的需求只是先知道结果有多少行,或者可以先拿到行数再处理实际数据,最直接的方式是先执行一个COUNT(*)的统计查询,然后读取这个结果值。这种方式适合不需要实际数据、或者想提前做分页逻辑的场景。
Swift代码示例:
func getTotalRowCount(forTable tableName: String, withCondition condition: String?) -> Int { var statement: OpaquePointer? var countQuery = "SELECT COUNT(*) FROM \(tableName)" // 拼接查询条件(如果有的话) if let condition = condition, !condition.isEmpty { countQuery += " WHERE \(condition)" } countQuery += ";" guard sqlite3_prepare_v2(yourDatabaseHandle, countQuery, -1, &statement, nil) == SQLITE_OK else { print("Failed to prepare count query: \(String(cString: sqlite3_errmsg(yourDatabaseHandle)))") return 0 } var rowCount = 0 if sqlite3_step(statement) == SQLITE_ROW { rowCount = Int(sqlite3_column_int(statement, 0)) } sqlite3_finalize(statement) return rowCount }
方案2:遍历结果集时实时计数
如果已经要读取并处理查询结果的每一行数据,那完全可以在遍历过程中累加计数器,这样不需要额外执行一次COUNT查询,效率更高。
Swift代码示例:
func fetchDataAndCountRows() -> (results: [[String: Any]], totalRows: Int) { var statement: OpaquePointer? let query = "SELECT column1, column2 FROM your_table WHERE your_condition;" var results = [[String: Any]]() var rowCount = 0 guard sqlite3_prepare_v2(yourDatabaseHandle, query, -1, &statement, nil) == SQLITE_OK else { print("Failed to prepare query: \(String(cString: sqlite3_errmsg(yourDatabaseHandle)))") return (results, rowCount) } // 遍历每一行,同时计数 while sqlite3_step(statement) == SQLITE_ROW { rowCount += 1 // 读取当前行的列数据(根据你的需求调整) let column1Value = String(cString: sqlite3_column_text(statement, 0)) let column2Value = Int(sqlite3_column_int(statement, 1)) results.append(["column1": column1Value, "column2": column2Value]) } sqlite3_finalize(statement) return (results, rowCount) }
避坑提醒:别用sqlite3_changes()!
你可能会搜到sqlite3_changes()这个函数,但它只能返回最近一次INSERT/UPDATE/DELETE操作影响的行数,对于SELECT查询完全无效,会返回0,可别用错了哦~
内容的提问来源于stack exchange,提问作者iKK
相关产品推荐
相关产品推荐

