【问题标题】:SQLite query runs on SQLiteManager but not on iOSSQLite 查询在 SQLiteManager 上运行,但不在 iOS 上
【发布时间】:2023-03-14 05:44:01
【问题描述】:

有一个 sqlite 问题。该查询在 Firefox 插件 SQLiteManager 上运行良好。但是它不能在 iOS 上运行。我收到错误代码 1。数据库连接正常。

NSString *sqLiteDb = [[NSBundle mainBundle] pathForResource:@"featureDB"
                                                     ofType:@"sqlite3"];

if (sqlite3_open([sqLiteDb UTF8String], &_database) != SQLITE_OK) {
    DLog(@"Failed to open database!");
} else {

    DLog(@"Connected to db");

}



NSString *query = [NSString stringWithFormat:@"SELECT * FROM featureTable"];

sqlite3_stmt *statement;


NSLog(@"could not prepare statement: %s\n", sqlite3_errmsg(_database));


if (sqlite3_prepare_v2(_database, [query UTF8String], -1, &statement, nil) == SQLITE_OK) {
    while (sqlite3_step(statement) == SQLITE_ROW) {

        DLog(@"row");

        int uniqueId = sqlite3_column_int(statement, 0);



    }
    sqlite3_finalize(statement);

    DLog(@"sqliteStep");

} else {

    DLog(@"statement Error %d", sqlite3_prepare_v2(_database, [query UTF8String], -1, &statement, nil));

}

“row 或 sqliteStep”的日志永远不会触发。

【问题讨论】:

  • 那么生成的错误信息是什么? (提示,阅读规范。)
  • 顺便说一下,如果你从包中打开数据库,它是只读的。这是你的意图吗?通常,应用程序会在文档文件夹中查找 db,并且只有在没有找到的情况下,应用程序才会将其从捆绑包复制到文档文件夹。见stackoverflow.com/a/26325358/1271826。这不是您上述例程中的问题,只是仅供参考。

标签: ios sql objective-c sqlite


【解决方案1】:

问题是我的文件是 sqlite 扩展名,但代码指定了 sqlite3 的扩展名。我以为这两个是同义词,但他们不是

【讨论】:

    【解决方案2】:

    您的else 语句不应再次调用sqlite3_prepare_v2,而应:

    DLog(@"prepare error: %s", sqlite3_errmsg(_database));
    

    此错误消息报告什么?

    注意:在调用sqlite3_prepare_v2 之前,您已经在记录sqlite3_errmsg。当然这不会报告任何错误,因为可能还没有发生错误。在您知道sqlite3_prepare_v2 (a) 已被调用的else 子句执行此日志记录;但是(b)没有返回SQLITE_OK。并且不要在 sqlite3_prepare_v2 失败和记录错误消息之间调用任何 SQLite 函数。

    最常见的问题是它报告没有这样的表。如果这就是您所看到的,在这种情况下,这可能是由于未能将数据库包含在应用程序包中(请参阅目标设置的“构建阶段”部分的“复制包资源”部分)。

    或者,如果它说数据库很忙,如果您的数据库打开调用和数据库关闭调用不匹配(就像您在此代码示例中一样),可能会发生这种情况。

    【讨论】:

    • 啊!我现在明白了。它说没有这样的表。
    • sqlite3_open_v2([sqLiteDb UTF8String], &_database, SQLITE_OPEN_READWRITE, NULL) 返回 SQLITE_OK,所以我猜该表拼写错误?但是,如果查询在其他程序中运行良好,那又如何呢?
    • NSString *sqLiteDb 为空,我认为是问题所在
    • 这意味着它没有在捆绑包中找到它。我已经提到过几次了,但是您是否检查过 Xcode 中目标的“构建阶段”的“复制捆绑资源”部分?!?这是在打开据称从捆绑包中获得的数据库时收到“未找到表”错误时要检查的第一件事。
    • 扩展名无关紧要,但它必须与您的代码要查找的内容相匹配,即sqlite3 扩展名。如果文件确实是sqlite 扩展名,请更改代码以匹配。就个人而言,我总是使用sqlite 作为我的扩展名。
    【解决方案3】:

    当您在模拟器中运行应用程序时,请确保您的 sqlite db 没有被任何 sqlite db 浏览器打开。 它发生在我身上,我在 sqlite 浏览器中打开了我的 sqlite 数据库来测试我的查询,当我从模拟器运行应用程序时,它没有更新数据库中的任何内容。

    【讨论】:

    • 谢谢!不幸的是,我认为这不是问题 =/ 我关闭了所有内容,但还是一样。
    猜你喜欢
    • 2017-12-02
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 2020-01-20
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    • 2011-11-05
    相关资源
    最近更新 更多