ios sqlite3_bind_文本步骤返回null

ios sqlite3_bind_文本步骤返回null,ios,sqlite,Ios,Sqlite,在下面的代码中,一切似乎都是正确的,但是不管我向它们提供了什么数据,带符号的行总是返回一个null的错误代码。我已经研究并改变了我能想到的所有参数。第一个sqlite3_bind_文本行成功,接下来的三行每次都失败。我想不出来。帮忙 -(void)fillSqliteDb { sqlite3 *database; if (sqlite3_open([[self sqliteFilePath] UTF8String], &database) != SQLITE_OK) {

在下面的代码中,一切似乎都是正确的,但是不管我向它们提供了什么数据,带符号的行总是返回一个null的错误代码。我已经研究并改变了我能想到的所有参数。第一个sqlite3_bind_文本行成功,接下来的三行每次都失败。我想不出来。帮忙

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

    }

}
-(void)fillSqliteDb
{
sqlite3*数据库;
if(sqlite3_打开([[self-sqliteFilePath]UTF8String],&database)!=SQLITE_确定){
sqlite3_关闭(数据库);
NSAssert(0,@“无法打开数据库”);
}
NSString*createSQL=@“创建不存在的表函数(名词文本、动词文本、副词文本、形容词文本);”;
char*errorMsg;
if(sqlite3_exec(数据库,[createSQL UTF8String],NULL,NULL,&errorMsg)!=SQLITE_OK){
sqlite3_关闭(数据库);
NSAssert(0,@“创建表时出错:%s”,errorMsg);
}
sqlite3_stmt*stmt;

对于(inti=0;i而言,此代码有几处错误

  • 只调用
    sqlite3\u prepare\u v2
    一次。在
    for
    循环之前执行此操作
  • 您需要为每个变量调用一次
    sqlite3\u bind\u xxx
    ,然后再调用
    sqlite3\u step
  • 每个循环只调用一次
    sqlite2\u步骤
    。在循环结束时执行此操作
  • 在循环结束时调用
    sqlite3\u步骤
    后,需要调用
    sqlite3\u重置
  • 循环完成后,需要对准备好的语句调用
    sqlite3\u finalize
  • 由于在方法开始时打开了数据库连接,因此需要在方法结束时关闭它
  • 检查每个
    sqlite3\u步骤
    调用的结果后,对所有日志使用
    errorMsg
    是错误的。
    errorMsg
    仅在调用
    sqlite3\u exec
    时设置。要获取其他调用的错误消息,需要使用
    sqlite3\u 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);
    }
    
    -(void)fillSqliteDb{
    sqlite3*数据库;
    if(sqlite3_打开([[self-sqliteFilePath]UTF8String],&database)!=SQLITE_确定){
    sqlite3_关闭(数据库);
    NSAssert(0,@“无法打开数据库”);
    }
    NSString*createSQL=@“创建不存在的表函数(名词文本、动词文本、副词文本、形容词文本);”;
    char*errorMsg;
    if(sqlite3_exec(数据库,[createSQL UTF8String],NULL,NULL,&errorMsg)!=SQLITE_OK){
    sqlite3_关闭(数据库);
    NSAssert(0,@“创建表时出错:%s”,errorMsg);
    }
    sqlite3_stmt*stmt;
    char*update=“插入函数(名词、动词、副词、形容词)值(?,?,?);”;
    if(sqlite3\u prepare\u v2(数据库,更新,-1,&stmt,nil)==SQLITE\u确定){
    
    对于(int i=0;看,我已经采纳了您的建议,现在它可以正常工作了。我还使用sqlite3_exec使它正常工作,如代码所示。非常感谢您的帮助。很明显,我确实需要它。