0

現在テーブルが 1 つしかない SQLite データベースを作成しました。それを Xcode に接続し、必要なすべての手順を実行し、ファイルの書き込みに問題があることを発見しました。

テーブルには 5 つの項目 (主キー、名前、生年月日、大学名、コース名) があります。

私のデータを保存している間、それは言います:

キャッチされない例外 'NSInternalInconsistencyException' が原因でアプリを終了しています。理由: 'add ステートメントの作成中にエラーが発生しました。「ライブラリ ルーチンが順番どおりに呼び出されませんでした」

ブレークポイントを設定して問題の場所を見つけましたが、解決できません。

-(void)saveStudentInfo{

sqlite3_stmt *statement = NULL;


    const char *sql = "insert into studentInfo (name,collegeName,courseName) Values (?, ?, ?)";

    if (sqlite3_open("my_db_filename.db", &database) == SQLITE_OK)
    {
        //sqlite3_stmt *addStmt;

        if(sqlite3_prepare_v2(database, sql, -1, &addStmt, NULL) != SQLITE_OK)
        {
            NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(database));
        } else {
            // do things with addStmt, call sqlite3_step
            sqlite3_bind_text(addStmt, 1, [studentName UTF8String], -1, SQLITE_TRANSIENT);
            sqlite3_bind_text(addStmt, 3, [studentCollegeName UTF8String], -1, SQLITE_TRANSIENT);
            sqlite3_bind_text(addStmt, 4, [studentCourseName UTF8String], -1, SQLITE_TRANSIENT);

            if(SQLITE_DONE != sqlite3_step(addStmt))
                NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database));
            else
                studentID = sqlite3_last_insert_rowid(database);

            sqlite3_finalize(statement);
        }
        sqlite3_close(database);     
    }


if (sqlite3_step(statement)==SQLITE_DONE){
    UIAlertView *error = [[UIAlertView alloc]initWithTitle:@"Done" message:@"Files were added to database" delegate:self cancelButtonTitle:@"Close" otherButtonTitles:nil, nil];
    [error show];
}
else {
    UIAlertView *error = [[UIAlertView alloc]initWithTitle:@"Error" message:@"StudentOrganizer could not add database" delegate:self cancelButtonTitle:@"Close" otherButtonTitles:nil, nil];
    [error show];
}
4

1 に答える 1

1

sqlite3_prepare_v2 を呼び出す前にデータベースを開くのを忘れたと思います。

これを行う良い方法は次のとおりです。

sqlite3* database;
if (sqlite3_open("my_db_filename.db", &database) == SQLITE_OK)
{
    sqlite3_stmt *addStmt;

    if(sqlite3_prepare_v2(database, sql, -1, &addStmt, NULL) != SQLITE_OK)
    {
        NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(database));
    } else {
        // do things with addStmt, call sqlite3_step
        sqlite3_finalize(sqlStatement);
    }
    sqlite3_close(database);     
}
于 2012-10-02T17:45:05.873 に答える