2012-01-26 31 views
1

我獲得使用FMDB的executeUpdate下面的INSERT語句的EXC_BAD_ACCESS。它發生在FMDatabase的bindObject toColumn中。爲什麼插入一個整數到SQLite會炸燬?

在聲明的NSLog,我得到正確的價值觀,但更新語句炸彈了。不知道我在這裏做錯了什麼。

- (void) addSubject { 

    DrillDownAppAppDelegate *appDelegate = (DrillDownAppAppDelegate *)[[UIApplication sharedApplication] delegate]; 

    FMDatabase *database = [FMDatabase databaseWithPath:appDelegate.getDBPath];  
    [database open]; 

    NSLog(@"SUBJECT_ID/TITLE/CATEGORY_TITLE = %d/%@/%@", self.subject_id, self.title, self.category_title); 

    [database executeUpdate:@"insert into SUBJECT (subject_id, subject, category) values(?, ?, ?)", 
    self.subject_id, self.title, self.category_title, nil]; 

    [database close]; 

} 

我通過FMDatabase碼時,它看起來像第一個變量,subject_id是炸出來的一個。我試圖保存爲NSInteger以及NSNumber,兩者都發生了同樣的崩潰。

從FMDatabase確切行,其中它崩潰是:

else if ([obj isKindOfClass:[NSData class]]) { 

,它是經過subject_id作爲一個NSInteger(或NSNumber的),並給予該錯誤。

回答

2

FMDB executeUpdate語句要求您使用NSNumber而非NSInteger,因此將您的NSInteger轉換爲NSNumber作爲executeUpdate語句的一部分,它將起作用。我花了幾個小時尋找這個,並最終找到了它。

這裏是它應該如何看一個例子:

[database executeUpdate:@"update Subject Set subject = ?, category = ? where subject_id = ?", self.title, self.category_title, [NSNumber numberWithInt:self.subject_id]]; 
+0

作爲一個更一般的規則,它只接受'id'值。 – zneak

+1

如何爲NSNumber的一個「id」值和NSInteger的是不是? – jroyce

+2

'NSNumber'是一個Objective-C類,表示任何種類的數目。它繼承自'NSValue',它繼承自'NSObject'。另一方面,「NSInteger」和「NSUInteger」是基本類型。這些不是Objective-C對象,所以它們不能轉換爲'id'。接受可變數量參數的Objective-C方法不能檢查它們接收的參數的類型;這就是爲什麼它在編譯時工作,但在運行時崩潰。 – zneak

相關問題