为啥 sqlite3_prepare_v2 == FALSE?

Posted

技术标签:

【中文标题】为啥 sqlite3_prepare_v2 == FALSE?【英文标题】:Why does sqlite3_prepare_v2 == FALSE?为什么 sqlite3_prepare_v2 == FALSE? 【发布时间】:2012-08-02 17:45:33 【问题描述】:

不知道为什么 sqlite3_prepare_v2 等于 false。我在网上搜索并找不到太多,我找到的也没有帮助。一个站点建议使用 sqlite3_errmsg(database) 并且由于某种原因输出“不是错误”。另一个在线答案建议删除 iPhone 模拟器中以十六进制字符串命名的文件夹,但这也不起作用。我创建了我的数据库并放入了支持文件文件夹,所以它在那里并且有记录。

这是我的代码:

-(void)readMovesFromDatabaseWithPath:(NSString *)filePath

    sqlite3 *database;

    printf("Here in readMovesFromDatabaseWithPath\n");

    if(sqlite3_open([filePath UTF8String], &database) == SQLITE_OK)
    
        NSLog(@"Now in readMovesFromDatabaseWithPath\n");

        const char *sqlStatement = "select * from moves";
        sqlite3_stmt *compiledStatment;

        printf( "could not prepare statemnt: %s\n", sqlite3_errmsg(database) ); //returns "not an error"

        if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatment, NULL) == SQLITE_OK)
        
            NSLog(@"In sqlite3_prepare_v2 block\n"); //does not reach this line

            while(sqlite3_step(compiledStatment) == SQLITE_ROW) //Loops through the database
            
                //Extracts the move's name
                NSString *moveName = [NSString stringWithUTF8String:(char *) sqlite3_column_text(compiledStatment, 1)];

                //Extracts the move's description
                NSString *moveDescription = [NSString stringWithUTF8String:(char *) sqlite3_column_text(compiledStatment, 2)];

                //Creates new move objects
                Moves *newMove = [[Moves alloc] init];
                newMove.moveName = moveName;
                newMove.moveDescription = moveDescription;
                [self.moves addObject:newMove];
            
        

        sqlite3_finalize(compiledStatment);
    
    sqlite3_close(database);

【问题讨论】:

【参考方案1】:

尝试将打印错误的语句移动到 else 子句中。您的程序会告诉您失败的原因:

    if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatment, NULL) == SQLITE_OK)
    
       /* your code here */
    
    else
    
        printf( "could not prepare statemnt: %s\n", sqlite3_errmsg(database) );
     

最可能的情况是表moves 不存在。

【讨论】:

Nvm。我在代码中放置了一些调试行,发现数据库路径为空,但与 SQLITE_OK 表达式相比,它仍然等于 true。这有点愚蠢。问题是我必须手动将 sqlite3 文件放在项目文件夹中,然后通过 xcode “添加到现有项目”。我最初在我的桌面上创建了数据库,并将项目放在一个单独的文件夹中。 “复制到文件夹”选项有效,但 XCode 出于某种原因不承认其路径。 :/无论如何修复它。不过感谢您的帮助。【参考方案2】:

您没有将您的 sqlStatement 分配给您的已编译状态。

const char *compiledStatment = [sqlStatement UTF8String];

【讨论】:

以上是关于为啥 sqlite3_prepare_v2 == FALSE?的主要内容,如果未能解决你的问题,请参考以下文章

sqlite3_prepare_v2 不会返回花费太长时间(慢)和使用内存

SQLite sqlite3_prepare_v2没有错误,但也没有

C++ sqlite3使用sqlite3_prepare_v2接口报错,求大神解答

如何修复 Xcode 中的“_sqlite3_prepare_v3”链接器错误

sqlite3接口API函数备注

sqlite3接口API函数备注