sqlite3_prepare_v2正在获取SQLITE_ERROR

时间:2011-02-27 21:15:58

标签: objective-c xcode sqlite

我已经在这几个小时了,必须让这个工作!它正在举办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;

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

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

3 个答案:

答案 0 :(得分:6)

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

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

这给了一个稍微不同的路径(一个额外的目录) - 一旦我用它,它工作!希望这有助于其他人......我花了很多时间来做这件事。

答案 1 :(得分:1)

请注意,上面的内容稍微不准确,ofType应该不使用扩展名,而且ofType显然需要与您的文件扩展名匹配。

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

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

答案 2 :(得分:0)

代码似乎很好,可能是一个愚蠢的问题,但你是否在数据库中创建了QandA表?