SQLite "SQLITE MISUSE" 错误

3

我遇到了SQLite的问题。当我尝试插入条目时,出现错误。通过使用错误代码21,我发现错误是"SQLITE MISUSE"。

NSLog(@"ERROR:  Failed to add food!  (code: %d)",sqlite3_step(statement));

当需要时,我的代码中的insertSQL字符串被正确创建。另外,我可以通过iFunBox看到创建的表。

这是我的插入方法:

-(void)saveDataWithCategoryNumber:(int)categoryNumber foodNumber:(int)foodNumber foodName:(NSString *)foodName definiton:(NSString *)definiton ingredients:(NSString *)ingredients calorie:(int)calorie price:(int)price image1:(NSString *)image1 image2:(NSString *)image2 image3:(NSString *)image3 image4:(NSString *)image4 {
sqlite3_stmt    *statement;
const char *dbpath = [databasePath UTF8String];

if (sqlite3_open(dbpath, &foodDB) == SQLITE_OK)
{
    NSString *insertSQL = [NSString stringWithFormat: @"INSERT INTO foodDB (categoryNumber, foodNumber, foodName, definiton, ingredients, calorie, price, image1, image2, image3, image4) VALUES (%i, %i, \"%@\",  \"%@\",  \"%@\",  %i,  %i,  \"%@\",  \"%@\",  \"%@\",  \"%@\")", categoryNumber, foodNumber, foodName, definiton, ingredients, calorie, price, image1, image2, image3, image4];

    const char *insert_stmt = [insertSQL UTF8String];
    sqlite3_prepare_v2(foodDB, insert_stmt, -1, &statement, NULL);
    //char *error;
    //sqlite3_exec(foodDB, insert_stmt, NULL, NULL, &error);

    NSLog(@"insertSQL: %@",insertSQL);

    if (sqlite3_step(statement) == SQLITE_DONE)
    {
        NSLog(@"Food added.");
    } else {
        NSLog(@"ERROR:  Failed to add food!  (code: %d)",sqlite3_step(statement));

    }

    sqlite3_finalize(statement);
    sqlite3_close(foodDB);
}}

也许创建方法会很有用:
-(void)createDatabase{
NSString *docsDir;
NSArray *dirPaths;
// Get the documents directory
dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

docsDir = [dirPaths objectAtIndex:0];

// Build the path to the database file
databasePath = [[NSString alloc] initWithString: [docsDir stringByAppendingPathComponent: @"foodDB.db"]];

NSFileManager *filemgr = [NSFileManager defaultManager];

if ([filemgr fileExistsAtPath: databasePath ] == NO)
{
    const char *dbpath = [databasePath UTF8String];

    if (sqlite3_open(dbpath, &foodDB) == SQLITE_OK)
    {
        char *errMsg;
        const char *sql_stmt = "CREATE TABLE IF NOT EXISTS foodDB (ID INTEGER PRIMARY KEY AUTOINCREMENT, categoryNumber INT, foodNumber INT, foodName TEXT, definition TEXT, ingredients TEXT, calorie INT, price INT, image1 TEXT, image2 TEXT, image3 TEXT, image4 TEXT)";

        if (sqlite3_exec(foodDB, sql_stmt, NULL, NULL, &errMsg) != SQLITE_OK)
        {
            NSLog(@"ERROR:  Failed to create database!");
        }

        sqlite3_close(foodDB);

    } else {
        NSLog(@"ERROR:  Failed to open/create database!");
    }
}

}

3个回答

1
在我的情况下,我使用的是sqlite3_exec而不是sqlite3_prepare_v2,这导致了错误。更改SQL语句解决了问题。

1

你的日志逻辑执行了两个sqlite_step()操作,这最多是误导性的。

相反,捕获第一个sqlite_step()调用的返回代码并报告值:

int rc = sqlite3_step(statement);
if (rc == SQLITE_OK)
{
    NSLog(@"Food added.");
} else {
    NSLog(@"ERROR:  Failed to add food!: %d", rc);
}

您需要将这个逻辑扩展到代码中所有的sqlite_xxx()调用。


嗯,你的代码和我的没有区别。两者都会产生相同的错误。 - m.etka
我有一个构造方法,但它正常工作。我可以通过iFunBox看到已创建的数据库和表。我的问题在于这个方法没有正常工作。 - m.etka
@mete 代码出现了问题,就如我在回答中所解释的那样。请修复它并重新发布完整的方法。 - trojanfoe
我还需要一个答案,请。当您询问时,我已经添加了代码。 - m.etka

1
我发现一个奇怪的情况,我在语句中使用的“definition”单词导致了错误。有趣的是,“definition”单词没有列在SQLite关键字列表中(http://www.sqlite.org/lang_keywords.html)。
当我用“def”替换“definition”时,问题得到解决。(createDatabase方法)
const char *sql_stmt = "CREATE TABLE IF NOT EXISTS foodDB (ID INTEGER PRIMARY KEY AUTOINCREMENT, categoryNumber INT, foodNumber INT, foodName TEXT, definition TEXT, ingredients TEXT, calorie INT, price INT, image1 TEXT, image2 TEXT, image3 TEXT, image4 TEXT)";

const char *sql_stmt = "CREATE TABLE IF NOT EXISTS foodDB (ID INTEGER PRIMARY KEY AUTOINCREMENT, categoryNumber INT, foodNumber INT, foodName TEXT, def TEXT, ingredients TEXT, calorie INT, price INT, image1 TEXT, image2 TEXT, image3 TEXT, image4 TEXT)";

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接