-1

次のコードではすべてが正しいように見えますが、どのようなデータを入力しても、表記された行は常に null のエラー コードを返します。考えられるすべてのパラメーターを調査して変更しました。最初の sqlite3_bind_text 行は成功し、次の 3 行は毎回失敗します。私はそれを理解することはできません。ヘルプ?

-(void)fillSqliteDb
{
    sqlite3 *database;
    if (sqlite3_open([[self sqliteFilePath] UTF8String], &database) != SQLITE_OK) {
        sqlite3_close(database);
        NSAssert(0, @"Failed to open database");
    }

    NSString *createSQL = @"CREATE TABLE IF NOT EXISTS FUNCTIONS  (nouns TEXT, verbs TEXT, adverbs TEXT, adjectives TEXT);";
    char *errorMsg;
    if (sqlite3_exec (database, [createSQL UTF8String], NULL, NULL, &errorMsg) != SQLITE_OK) {
        sqlite3_close(database);
        NSAssert(0, @"Error creating table: %s", errorMsg);
    }
    sqlite3_stmt *stmt;

    for (int i=0; i<260; i++) {
        NSString * pln = self.pluralNouns[i]; // pre-filled array of 260 words
        NSString * vrb = self.verb[i]; // pre-filled array of 260 words
        NSString * adv = self.adverb[i]; // pre-filled array of 260 words
        NSString * adj = self.adjective[i]; // pre-filled array of 260 words

        char *update = "INSERT INTO FUNCTIONS (nouns, verbs, adverbs, adjectives) VALUES (?, ?, ?, ?);";

        if (sqlite3_prepare_v2(database, update, -1, &stmt, nil) == SQLITE_OK) {
            sqlite3_bind_text(stmt, 1, [pln UTF8String], -1, NULL);
            if (sqlite3_step(stmt) != SQLITE_DONE) // Works, word ends up in database
              NSLog(@"Error updating table: %s", errorMsg);
           sqlite3_bind_text(stmt, 2, [vrb UTF8String], -1, NULL);
            if (sqlite3_step(stmt) != SQLITE_DONE) // ALWAYS RETURNS Error: NULL
                NSLog(@"Error updating table: %s", errorMsg);
            sqlite3_bind_text(stmt, 3, [adv UTF8String], -1, NULL);
            if (sqlite3_step(stmt) != SQLITE_DONE) // ALWAYS RETURNS Error: NULL
                NSLog(@"Error updating table: %s", errorMsg);
            sqlite3_bind_text(stmt, 4,[adj UTF8String], -1, NULL);
            if (sqlite3_step(stmt) != SQLITE_DONE) // ALWAYS RETURNS Error: NULL
                NSLog(@"Error updating table: %s", errorMsg);
        }

    }

}
4

1 に答える 1

7

このコードにはいくつか問題があります。

  1. 電話sqlite3_prepare_v2は一度だけ。forループの前に行います。
  2. sqlite3_bind_xxxを呼び出す前に、変数ごとに 1 回呼び出す必要がありますsqlite3_step
  3. sqlite2_stepループごとに 1 回だけ呼び出します。ループの最後でこれを行います。
  4. ループの最後で呼び出した後sqlite3_step、 を呼び出す必要がありますsqlite3_reset
  5. sqlite3_finalizeループの後、準備されたステートメントを呼び出す必要があります。
  6. メソッドの開始時にデータベース接続を開いたので、メソッドの最後で閉じる必要があります。
  7. 各呼び出しerrorMsgの結果を確認した後のすべてのログに対する の使用は間違っています。への呼び出しからのみ設定されます。他の呼び出しのエラー メッセージを取得するには、 を使用する必要があります。sqlite3_steperrorMsgsqlite3_execsqlite3_errmsg

更新されたコード:

- (void)fillSqliteDb {
    sqlite3 *database;
    if (sqlite3_open([[self sqliteFilePath] UTF8String], &database) != SQLITE_OK) {
        sqlite3_close(database);
        NSAssert(0, @"Failed to open database");
    }

    NSString *createSQL = @"CREATE TABLE IF NOT EXISTS FUNCTIONS  (nouns TEXT, verbs TEXT, adverbs TEXT, adjectives TEXT);";
    char *errorMsg;
    if (sqlite3_exec (database, [createSQL UTF8String], NULL, NULL, &errorMsg) != SQLITE_OK) {
        sqlite3_close(database);
        NSAssert(0, @"Error creating table: %s", errorMsg);
    }

    sqlite3_stmt *stmt;
    char *update = "INSERT INTO FUNCTIONS (nouns, verbs, adverbs, adjectives) VALUES (?, ?, ?, ?);";

    if (sqlite3_prepare_v2(database, update, -1, &stmt, nil) == SQLITE_OK) {
        for (int i=0; i<260; i++) {
            NSString * pln = self.pluralNouns[i]; // pre-filled array of 260 words
            NSString * vrb = self.verb[i]; // pre-filled array of 260 words
            NSString * adv = self.adverb[i]; // pre-filled array of 260 words
            NSString * adj = self.adjective[i]; // pre-filled array of 260 words

            sqlite3_bind_text(stmt, 1, [pln UTF8String], -1, NULL);
            sqlite3_bind_text(stmt, 2, [vrb UTF8String], -1, NULL);
            sqlite3_bind_text(stmt, 3, [adv UTF8String], -1, NULL);
            sqlite3_bind_text(stmt, 4, [adj UTF8String], -1, NULL);

            if (sqlite3_step(stmt) != SQLITE_DONE) // ALWAYS RETURNS Error: NULL
                NSLog(@"Error updating table: %s", sqlite3_errmsg(database));
            sqlite3_reset(stmt);
        }

        sqlite3_finalize(stmt);
    }

    sqlite3_close(database);
}
于 2013-06-02T21:57:13.587 に答える