ios sqlite3_bind_text步骤返回null

时间:2013-06-02 19:09:14

标签: ios sqlite

在下面的代码中,一切似乎都是正确的,但是无论我提供什么数据,带注释的行总是返回错误代码null。我研究并改变了我能想到的所有参数。第一个sqlite3_bind_text行成功,接下来的三行每次都失败。我无法弄清楚。帮助

-(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);
        }

    }

}

1 个答案:

答案 0 :(得分:7)

此代码有几个问题。

  1. 仅拨打sqlite3_prepare_v2一次。在for循环之前完成。
  2. 在调用sqlite3_bind_xxx之前,您需要为每个变量拨打sqlite3_step一次。
  3. 每次循环只调用sqlite2_step一次。在循环结束时执行此操作。
  4. 在循环结束时调用sqlite3_step后,您需要致电sqlite3_reset
  5. 在循环之后,您需要在准备好的声明上调用sqlite3_finalize
  6. 由于您在方法开头打开了数据库连接,因此需要在方法结束时关闭它。
  7. 在检查每个errorMsg调用的结果后,您对所有日志使用sqlite3_step是错误的。 errorMsg仅在调用sqlite3_exec时设置。要获取其他呼叫的错误消息,您需要使用sqlite3_errmsg
  8. 更新的代码:

    - (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);
    }