-1

データベースに新しい行を挿入できません。私は何を間違っていますか?

-(void)InsertRecords{
    fileMgr = [NSFileManager defaultManager];
    sqlite3_stmt *stmt;
    sqlite3 *cruddb;

    const char *sql = "Insert into AllDictionary(id, DeleteFlag, TitleBD, Description, PathToDB, ImageURL) VALUES('565','asasf2','asfas2ff','fggaga2hah','b2bb','aa2aa')";
    NSString *cruddatabase = [self.GetDocumentDirectory stringByAppendingPathComponent:@"MainDb.sqlite"];

    if(!(sqlite3_open([cruddatabase UTF8String], &cruddb)==SQLITE_OK))
    {
        NSLog(@"An error has occured: %s",sqlite3_errmsg(cruddb));
    }
    if (sqlite3_prepare(cruddb, sql, -1, &stmt, NULL)!=SQLITE_OK) {
        NSLog(@"Problem with prepare statement: %s", sqlite3_errmsg(cruddb));
    } else {
        sqlite3_step(stmt);
    }
    sqlite3_finalize(stmt);
    sqlite3_close(cruddb);
}
4

1 に答える 1

2

IDタイプはintです。したがって、問題はクエリにあります。

const char *sql = "Insert into AllDictionary(id, DeleteFlag, TitleBD, Description, PathToDB, ImageURL) VALUES('565','asasf2','asfas2ff','fggaga2hah','b2bb','aa2aa')";

整数値には引用符を使用しないでください。文字列値には引用符を使用しないでください。クエリを次のように変更します。

const char *sql = "Insert into AllDictionary(id, DeleteFlag, TitleBD, Description, PathToDB, ImageURL) VALUES(565,'asasf2','asfas2ff','fggaga2hah','b2bb','aa2aa')";

また、dbが開かれていない場合、prepareステートメントが常に実行されるなど、メソッドには多くの間違いがあります。Finalizeステートメントは、prepareステートメントの実行の有無にかかわらず常に機能します。したがって、次のように書き直します。

-(void)InsertRecords
{
    fileMgr = [NSFileManager defaultManager];
    NSString *cruddatabase = [self.GetDocumentDirectory stringByAppendingPathComponent:@"MainDb.sqlite"];
    sqlite3_stmt *stmt;
    sqlite3 *cruddb;

    const char *sql = "Insert into AllDictionary(id, DeleteFlag, TitleBD, Description, PathToDB, ImageURL) VALUES(565,'asasf2','asfas2ff','fggaga2hah','b2bb','aa2aa')";

    if((sqlite3_open([cruddatabase UTF8String], &cruddb)==SQLITE_OK))
    {
        if (sqlite3_prepare(cruddb, sql, -1, &stmt, NULL) ==SQLITE_OK)
        {
            sqlite3_step(stmt);
            sqlite3_finalize(stmt);
        }
        else 
        {
            NSLog(@"Problem with prepare statement: %s", sqlite3_errmsg(cruddb));
        }
        sqlite3_close(cruddb);
    }
    else
    {
       NSLog(@"An error has occured: %s",sqlite3_errmsg(cruddb));
    }
}
于 2012-11-10T12:41:17.657 に答える