【问题标题】:sqlite3_prepare_v2 is getting SQLITE_ERRORsqlite3_prepare_v2 得到 SQLITE_ERROR
【发布时间】:2011-07-05 09:29:06
【问题描述】:

我已经在这工作了好几个小时,必须让这个工作正常进行!它阻止了 iPhone 应用程序的发布……我第一次使用 SQLite。我已经听从了所有建议,但我的 sqlite3_prepare_v2 调用每次都会收到 SQLITE_ERROR (1)!

这是我的控制器中的代码:

        NSString *query = @"SELECT * FROM QandA ORDER BY random() LIMIT 1";
//  const char *sqlStatement = "SELECT * FROM QandA ORDER BY random() LIMIT 1";
    sqlite3_stmt *compiledStatement;

    // sqlite3_stmt *statement;
    int prepareStatus = sqlite3_prepare_v2(database, [query UTF8String],
                                           -1, &compiledStatement, NULL);
    if (prepareStatus == SQLITE_OK) {...

您会注意到我尝试使用“char *”也无济于事(在其他尝试中)。我的数据库可以正常打开:

    databaseName = @"Facts.sqlite";
// Get the path to the documents directory and append the databaseName
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [documentPaths objectAtIndex:0];
databasePath = [documentsDir stringByAppendingPathComponent:databaseName];
NSLog(@"databasePath = %@", databasePath);

int dbOpenStatus = sqlite3_open_v2([databasePath UTF8String], &database, SQLITE_OPEN_READWRITE, NULL);

从我的控制器界面:

    NSString *databaseName;
NSString *databasePath;

我已经检查了调试器,一切看起来都很好,但是准备语句失败了。我不知道如何记录它试图编译的语句......我假设/希望这正是我的 SELECT 所说的。

有人可以帮忙吗?我很绝望。标记

【问题讨论】:

  • 如果你想在 Objective-C 中访问 SQLite 数据库,我建议使用 fmdb,github.com/ccgus/fmdb
  • 好的,(终于)知道了如何获得更详细的错误信息。准备调用的错误是“没有这样的表:myTableName”。它在那里,我还记录了 MyDb.sqlite 文件的完整路径。表就是报错中显示的名字,为什么会这样呢?!
  • 查看了 FMDB,以后会考虑。谢谢。
  • @mark;如果您展示了如何获取更详细的错误消息,将会对其他人有所帮助

标签: objective-c xcode sqlite


【解决方案1】:

代码看起来不错,可能是一个愚蠢的问题,但您是否在数据库中创建了 QandA 表?

【讨论】:

  • 不会是第一次做出愚蠢的举动,但是是的,桌子就在那里。
【解决方案2】:

找到答案here。我不得不使用它来代替数据库文件的路径:

[[NSBundle mainBundle]pathForResource:@"Facts"extension:@"sqlite"];

这给出了一个稍微不同的路径(一个额外的目录)——一旦我使用它就可以了!希望这对其他人有所帮助...我花了很多时间。

【讨论】:

  • span class="comcopy">这里一样,databasePath 为空。我仍然相信这个 if(sqlite3_open(dbPath, &myDataBase) == SQLITE_OK) 应该返回 false,这样错误会更容易追踪
【解决方案3】:

请注意,以上内容略有不准确,ofType 应该使用而不是扩展名,ofType 显然需要与您的文件扩展名匹配。

如果您的数据库名为“mysqldatabase.sql”,请将您的路径 URL 更改为:

databasePath = [[NSBundle mainBundle]pathForResource:@"mysqldatabase" ofType:@"sql"];

【讨论】:

    猜你喜欢
    • 2018-04-19
    • 2015-02-07
    • 2011-03-18
    • 2014-11-14
    • 2014-04-15
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多