2013-02-23 2 views
0

У меня есть приложение iOS с использованием библиотеки FMDB.Objective-c FMDB SQLite insert withParameterDictionary и ключ автоинкремента

Существует 7 полевых SQLite DB (1 автоинкремент, 6 стандартных текстовых полей).

Я пытаюсь выполнить

[db executeUpdate:@"INSERT INTO messages VALUES (:field1,:field2,:field3,:field4,:field5,:field6)" withParameterDictionary:message]; 

Однако, потому что есть только 6 полей, которые я получаю сообщение об ошибке. Я не могу вставить значение автоинкремента, так как я не знаю, что это (я думаю, я мог бы разместить отдельный запрос для этого ...). И я стараюсь избегать синтаксиса, чувствительного к инъекциям

NSString* sql = [NSString stringWithFormat:@"insert into messages (%@) values (%@)", [newCols componentsJoinedByString:@", "], [newVals componentsJoinedByString:@", "]]; 

Благодарим за советы!

+0

Предположим, у вас есть столбец идентификатора, который автоматически увеличивается. Вам не нужно ничего предоставлять для этого столбца, поскольку он автоматически вставляется в БД. –

+0

Если я опускаю: primarykey в части значений, я получаю ошибку: табличные сообщения имеют 7 столбцов, но 6 значений были поставлены; Если я отправляю объект nil для pk, я получаю ошибку Ошибка: число привязок (6) неверно для # переменных в запросе (7); Если я использую @ "" для первичного ключа, я получаю «несоответствие типа данных», поскольку первичный ключ в целочисленном. – selytch

+0

Вы видели мой ответ и это вам помогает? –

ответ

1

Я просто посмотрел в своем коде, где я также использовал FMDB. Прежде всего, вы также должны предоставить столбцы в своей инструкции insert. Это то, что я делаю:

NSString *sqlSL = @"INSERT INTO SmartLibrary (TITEL, SUBTITEL, PICTURE, BLURB, MARK) VALUES (?, ? ,? ,? ,?)"; 
[db beginTransaction]; 
[db executeUpdate:sqlSL, book.title, book.subtitle, book.picture, book.summary, [NSNumber numberWithInteger:book.mark]]; 
[db commit]; 

У меня есть структура Книга в этом случае. Поэтому вам нужно предоставить столбцы, затронутые этой вставкой, в круглых скобках. Также вы можете увидеть, как сделать подготовленный оператор, и вы должны использовать транзакции. Надеюсь, это поможет!

3

Вы не указали, какой столбец был столбцом автоинкремента, поэтому я предполагаю, что это просто «поле1». Когда вы строите свой словарь, добавьте это:

[message setObject:[NSNull null] forKey:@"field1"]; 

затем

[db executeUpdate:@"INSERT INTO messages VALUES (:field1,:field2,:field3,:field4,:field5,:field6)" withParameterDictionary:message]; 

Обязательно измените «field1» в какой бы области вы используете для Autoincrement.

Смежные вопросы