3

以下の関数が呼び出されると、EXC_BAD_ACCESS クラッシュが発生します。FMDB は、WHERE 句でこの subject_id 列にヒットしたときに、2 つの NString と爆弾を通過するため、subject_id NSInteger の解釈に問題があるようです。

- (void) saveAllData {

if(isDirty) {

    DrillDownAppAppDelegate *appDelegate = (DrillDownAppAppDelegate *)[[UIApplication sharedApplication] delegate];
    FMDatabase *database = [FMDatabase databaseWithPath:appDelegate.getDBPath];    

    if ([database open]) {

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

        [database close];
    }

    isDirty = NO;
}

//Reclaim all memory here.
[title release];
title = nil;
[category_title release];
category_title = nil;

}

この問題は、FMDB 挿入の問題に関する別の投稿で遭遇したものと同じであり、これは私の subject_id メンバーの問題に要約されます。ヘッダーで間違った宣言を使用していると思います。ここにあります:

//
//  Subject.h
//  DrillDownApp

    #import <UIKit/UIKit.h>

    @interface Subject : NSObject {
        NSInteger subject_id;
        NSString *category_title;
        NSString *title;
    //    NSMutableArray *quotes;
        BOOL isDirty;
        //  BOOL isDetailViewHydrated;

    }

- (id) initWithPrimaryKey:(NSInteger)pk;
    @property (nonatomic, readwrite) BOOL isDirty;
    //@property (nonatomic, readwrite) BOOL isDetailViewHydrated;
- (void) addSubject;
- (NSInteger)getNextSubjectId;

    @property (nonatomic, assign) NSInteger subject_id;
    @property (nonatomic, copy) NSString * title;
    @property (nonatomic, copy) NSString * category_title;
    //@property (nonatomic, retain) NSMutableArray *quotes;
    //- (void) saveAllData;


    @end

(注:残りの部分を理解したので、これを主に編集しました。)

4

2 に答える 2

8

わかりました私はそれを解決しました。FMDB は整数を使用すると機能しません。それらを数値に変換する必要があります。FMDB docの例でこれが行われていることがわかりましたが、executeUpdate ステートメントを介して int が渡されることはありません。

したがって、上記の例では、これを修正する方法は次のとおりです。

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

これがもっと文書化されていればよかったのですが、まあまあです。

于 2012-01-30T06:17:29.487 に答える
2

メソッドをどこから呼び出しているのかわかりませんsaveAllData。それでもあなたの質問には要件がないので、誰でも答えることができます。

また、あなたのコードに 1 つの問題が見つかりました。

次のコードの代わりに、

//Update the value.
[sub setTitle:txtSubject.text];
[sub setCategory_title:txtCategory.text];

次のコードを使用します

//Update the value.
sub.title = txtSubject.text;
sub.category_title = txtCategory.text;

文字列にcopyプロパティがあるようにします。setter メソッドをオーバーライドする場合は、文字列を明示的にコピーする必要がある場合があります。それ以外の場合は、コピーなしで値を割り当てるだけです。

于 2012-01-28T14:19:24.703 に答える