Ваш массив на самом деле содержит 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);
}
Я рекомендовал бы Apache Портативное Время выполнения. Это является довольно маленьким, портативным, и мощным - приводит в действие Apache httpd через несколько платформ, по крайней мере.
Вы могли всегда рассматривать встраивание динамического времени выполнения языка в Вашем приложении. Ядро Lua не является большим вообще, обеспечивает типы данных, которые отвечают Вашим требованиям, открытый исходный код и MIT, лицензируемый, таким образом, это совместимо и с FOSS и с коммерческими проектами.
Необходимо было бы не обязательно использовать код, написанный в Lua для пользы, поскольку его API C обеспечивает полный доступ к его типам данных и их значениям. Однако Вы могли позже переместить часть логики Вашего приложения в Lua для улучшенной ясности выражения и других преимуществ кодирования на динамическом языке с функциями как первоклассные значения.