SQLite3 执行sqlite3_prepare_v2的时候提示“Error:no such table: bookCollect”的原因解析

当执行sqlite3_prepare_v2时遇到'Error:no such table: bookCollect',实际上是因为SQLite3找不到数据库文件,但它会自动创建一个空白数据库。此错误提示并不意味着数据库不存在,而是表明bookCollect表未被创建。问题可能源于数据库文件路径不正确。解决方案是确保使用正确的数据库相对路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题如下:

1、执行SQL编译的时候sqlite3_prepare_v2(sqlite, [sql UTF8String], -1, &stmt, NULL)的返回值为1,对应Apple的解释是


也就是找不到数据库文件,虽然我在模拟器文件中查看到数据库文件


解释:

这个就是SQLite3的自动处理机制,也就是“if it doesn't find the database,it will creat a blank database”,所以模拟器看到的数据库文件只是SQLite3进行编译的时候无法找到数据库文件从而自动创建的一个空的数据库文件。当然走到sqlite3_prepare_v2的时候会提示“Error:no such table: bookCollect”

参考:stack voerflow :stackoverfl(哈哈)ow.com/questions/21756185/sqlite3-prepare-v2-no-such-table


解决方法:

1、这是database的相对路径即可

    NSString *filePath = [NSHomeDirectory() stringByAppendingFormat:@"/Documents/%@",KFilename];

2、如果执行SQL语句有错误的时候,可以使用下面的API接口显示详细的错误信息


else if (strcmp(action, “7”) == 0) { int jingpin_id; char new_price[20]; // 解析参数(格式:"7 竞品编号 金额") if (sscanf(buffer, "%*s %d %19s", &jingpin_id, new_price) != 2) { send(connfd, msg20, strlen(msg20), 0); // 自动计算长度 return 0; } // 开启事务保证原子性 sqlite3_exec(db, "BEGIN TRANSACTION", 0, 0, 0); int transaction_active = 1; // 检查竞拍品状态 const char *check_sql = "SELECT qipaijia, zuigaojia, maijia FROM jingpin WHERE bianhao = ?;"; sqlite3_stmt *check_stmt = NULL; sqlite3_stmt *update_stmt = NULL; sqlite3_stmt *log_stmt = NULL; rc = sqlite3_prepare_v2(db, check_sql, -1, &check_stmt, NULL); if (rc != SQLITE_OK || sqlite3_bind_int(check_stmt, 1, jingpin_id) != SQLITE_OK) { send(connfd, msg21, strlen(msg21), 0); // 自动计算长度 goto rollback; } if (sqlite3_step(check_stmt) != SQLITE_ROW) { send(connfd, msg22, strlen(msg22), 0); // 自动计算长度 goto cleanup; } const unsigned char *qipaijia_str = sqlite3_column_text(check_stmt, 0); const unsigned char *zuigaojia_str = sqlite3_column_text(check_stmt, 1); double qipaijia = atof((const char*)qipaijia_str); // 字符串转数值 double current_max = atof((const char*)zuigaojia_str); int maijia_status = sqlite3_column_type(check_stmt, 2); // 验证逻辑 if (maijia_status != SQLITE_NULL) { send(connfd, msg23, strlen(msg23), 0); // 自动计算长度 goto rollback; } double effective_max = (current_max > 0) ? current_max : qipaijia; double new_price_val = atof(new_price); // 转换用户输入的金额 if (new_price_val <= effective_max) { send(connfd, msg24, strlen(msg24), 0); // 自动计算长度 goto cleanup; } // 更新最高价 const char *update_sql = "UPDATE jingpin SET zuigaojia = ? WHERE bianhao = ?;"; if (sqlite3_prepare_v2(db, update_sql, -1, &update_stmt, NULL) != SQLITE_OK || sqlite3_bind_text(update_stmt, 1, new_price, -1, SQLITE_STATIC) != SQLITE_OK || sqlite3_bind_int(update_stmt, 2, jingpin_id) != SQLITE_OK) { send(connfd, msg25, strlen(msg25), 0); // 自动计算长度 goto rollback; } if (sqlite3_step(update_stmt) != SQLITE_DONE) { send(connfd, msg25, strlen(msg25), 0); // 自动计算长度 goto rollback; } // 记录出价历史 const char *log_sql = "INSERT INTO chujia (jingpin_id, user_id, price) VALUES (?, ?, ?);"; if (sqlite3_prepare_v2(db, log_sql, -1, &log_stmt, NULL) != SQLITE_OK || sqlite3_bind_int(log_stmt, 1, jingpin_id) != SQLITE_OK || sqlite3_bind_int(log_stmt, 2, c->user_id) != SQLITE_OK || sqlite3_bind_double(log_stmt, 3, new_price_val) != SQLITE_OK) { send(connfd, msg26, strlen(msg26), 0); // 自动计算长度 goto rollback; } if (sqlite3_step(log_stmt) != SQLITE_DONE) { send(connfd, msg26, strlen(msg26), 0); // 自动计算长度 goto rollback; } // 提交事务 sqlite3_exec(db, "COMMIT", 0, 0, 0); transaction_active = 0; send(connfd, msg27, strlen(msg27), 0); // 自动计算长度 cleanup: if (check_stmt) sqlite3_finalize(check_stmt); if (update_stmt) sqlite3_finalize(update_stmt); if (log_stmt) sqlite3_finalize(log_stmt); return 0; // 返回统一状态码 rollback: if (transaction_active) { sqlite3_exec(db, “ROLLBACK”, 0, 0, 0); } goto cleanup; } else { send(connfd, msg5, strlen(msg5), 0); } }该段代码没有创建chujia表,是否错误
最新发布
04-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值