2012-01-26 10 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の両方で保存しようとしましたが、どちらも同じクラッシュを起こしました。

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

それはNSInteger(またはのNSNumber)としてsubject_idを通過し、エラーを与えている:

それがクラッシュFMDatabaseから正確な線です。

答えて

2

FMDB executeUpdateステートメントでは、NSIntegerをNSNumberに変換する必要があります.NSIntegerをexecuteUpdateステートメントの一部としてNSNumberに変換すると動作します。私はこれを探して何時間も費やし、ついにそれを見つけました。それだけで `id`値を受け入れ、より一般的なルールとして

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

:ここ

は、それがどのように見えるべきかの一例です。 – zneak

+1

NSNumberはどのように "id"値で、NSIntegerはありませんか? – jroyce

+2

'NSNumber'は任意の種類の数値を表すObjective-Cクラスです。 'NSObject'を継承した' NSValue'を継承しています。一方、 'NSInteger'と' NSUInteger'はプリミティブ型です。これらはObjective-Cオブジェクトではないので、 'id'に変換することはできません。可変数の引数を受け入れるObjective-Cメソッドは、受け取る引数の型をチェックすることはできません。これはコンパイル時には動作しましたが、実行時にはクラッシュしました。 – zneak

関連する問題