Сформировавшаяся стандартная библиотека для [закрытого] C

Ваш массив на самом деле содержит 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);
}
5
задан Milan 29 March 2009 в 21:05
поделиться

4 ответа

Что относительно бойкого от GTK?

14
ответ дан 18 December 2019 в 07:32
поделиться

Я рекомендовал бы Apache Портативное Время выполнения. Это является довольно маленьким, портативным, и мощным - приводит в действие Apache httpd через несколько платформ, по крайней мере.

4
ответ дан 18 December 2019 в 07:32
поделиться

Вы могли всегда рассматривать встраивание динамического времени выполнения языка в Вашем приложении. Ядро Lua не является большим вообще, обеспечивает типы данных, которые отвечают Вашим требованиям, открытый исходный код и MIT, лицензируемый, таким образом, это совместимо и с FOSS и с коммерческими проектами.

Необходимо было бы не обязательно использовать код, написанный в Lua для пользы, поскольку его API C обеспечивает полный доступ к его типам данных и их значениям. Однако Вы могли позже переместить часть логики Вашего приложения в Lua для улучшенной ясности выражения и других преимуществ кодирования на динамическом языке с функциями как первоклассные значения.

2
ответ дан 18 December 2019 в 07:32
поделиться

Смотрите на Gnulib

1
ответ дан 18 December 2019 в 07:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: