Ваш массив на самом деле содержит lockInfo.count / 5
строк данных.
Измените ваш цикл на:
for (int i = 0; i < lockInfo.count; i += 5) {
Затем обновите привязки:
sqlite3_bind_text(statement, 1, [[lockInfo objectAtIndex:i] UTF8String], -1, NULL);
sqlite3_bind_text(statement, 2, [[lockInfo objectAtIndex:i+1] UTF8String], -1, NULL);
sqlite3_bind_text(statement, 3, [[lockInfo objectAtIndex:i+2] UTF8String], -1, NULL);
sqlite3_bind_text(statement, 4, [[lockInfo objectAtIndex:i+3] UTF8String], -1, NULL);
sqlite3_bind_text(statement, 5, [[lockInfo objectAtIndex:i+4] UTF8String], -1, NULL);
Эти изменения поместят правильные значения в правильные столбцы и добавят правильное количество строк.
Кстати - это действительно плохая структура данных. Вы должны определить класс или структуру с 5 свойствами. Затем получите массив этого класса или структуры.
Помимо этой основной проблемы, вы также не используете правильно подготовленное утверждение. Вы должны подготовить оператор только один раз перед циклом.
Вот ваш код, написанный правильно, с лучшей проверкой ошибок:
- (void)insertLock:(NSMutableArray *)lockInfo {
NSString *databasePath = [self dataPath:@"eloqdb.sqlite3"];
sqlite3 *database;
if (sqlite3_open([databasePath UTF8String], &database) != SQLITE_OK) {
NSLog(@"Could not open database");
return;
} else {
NSLog(@"DB opened");
}
//for each element in the array, save the array index, and the contact:
NSLog(@"lockInfo %@", lockInfo);
NSLog(@"count %i", lockInfo.count);
sqlite3_stmt *statement;
NSString *SQLInsert = @"INSERT OR REPLACE INTO LOCK_PLAN_CHANGE (ID, FLAG, ITEM_DOOR_ID, KEY_SERIAL, TIMEZONE_ITEM_ID) VALUES (?, ?, ?, ?, ?);";
if (sqlite3_prepare_v2(database, [SQLInsert UTF8String], -1, &statement, nil) == SQLITE_OK) {
for (NSInteger i = 0; i < lockInfo.count; i += 5) {
sqlite3_bind_text(statement, 1, [lockInfo[i] UTF8String], -1, NULL);
sqlite3_bind_text(statement, 2, [lockInfo[i+1] UTF8String], -1, NULL);
sqlite3_bind_text(statement, 3, [lockInfo[i+2] UTF8String], -1, NULL);
sqlite3_bind_text(statement, 4, [lockInfo[i+3] UTF8String], -1, NULL);
sqlite3_bind_text(statement, 5, [lockInfo[i+4] UTF8String], -1, NULL);
if (sqlite3_step(statement) != SQLITE_DONE) {
// NSAssert1(0, @"Cannot Update Table", error);
}
sqlite3_reset(statement);
}
sqlite3_finalize(statement);
} else {
NSLog(@"Can't prepare: %s", sqlite3_errmsg(database));
}
sqlite3_close(database);
}