2013-02-23 75 views
0

我有一個使用FMDB庫的iOS應用程序。Objective-c FMDB插入withParameterDictionary和自動遞增鍵

有7個字段的SQLite數據庫(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

我想你有一個自動遞增的ID列。您不必爲此列提供任何內容,因爲它是由數據庫自動插入的。 – 2013-02-23 18:13:27

+0

如果我省略:值部分中的primarykey,我得到錯誤: 表消息有7列但提供了6個值; 如果我爲pk發送一個零對象,我得到錯誤 錯誤:綁定計數(6)對於查詢(7)中的變量數不正確; 如果我使用@「」作爲主鍵,則自從主鍵以整數形式獲得「數據類型不匹配」。 – selytch 2013-02-23 19:08:53

+0

您是否看到我的回答,並幫助您? – 2013-02-24 13:48:51

回答

1

我剛剛在我的代碼中看過FMDB。首先你還必須提供你的插入語句的列。這是我做的:

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

你沒有指定哪一列是自動增量列,所以我假設它只是「field1」。當你建立你的字典,補充一點:

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

然後

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

一定要改變「字段1」到你正在使用自動增量任何領域。