3

当调用下面的函数时,我得到 EXC_BAD_ACCESS 崩溃。看起来 FMDB 在解释 subject_id NSInteger 时遇到了问题,因为它在 WHERE 子句中遇到了这个 subject_id 列时,它通过了两个 NStrings 和炸弹。

- (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 文档的示例中完成的,并且从来没有一个 int 通过 executeUpdate 语句传递。

所以在我上面的例子中,我解决这个问题的方法如下:

[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。您的问题仍然缺乏要求,因此任何人都可以回答。

另外,我发现您的代码存在一个问题。

而不是下面的代码,

//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 回答