2012-01-26 26 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

相关问题