2012-01-27 119 views
3

当下面的函数被调用,我得到EXC_BAD_ACCESS崩溃。看起来FMDB在解析subject_id NSInteger时遇到了问题,因为当它击中WHERE子句中的这个subject_id列时,它会通过两个NString和炸弹。保存到数据库使用FMDB崩溃解释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 

(注:我编辑这majorly,我想通了,它的其余部分。)

+0

您正在将标题值和类别标题值设置为主题对象。但是,您将对象保存到数据库的位置? – Ilanchezhian 2012-01-27 07:40:19

+0

我将其更新为包含将对象保存到数据库的saveAllData函数。但问题是,它甚至没有使数据保留在对象中。我认为我的问题是我没有正确调用setTitle和setCategory_Title函数,因为在调试器中运行时,这些方法永远不会被触及... – jroyce 2012-01-27 18:44:36

回答

8

好吧,我解决了它。 FMDB不能使用整数。你必须将它们转换成数字。我发现这在FMDB doc的例子中完成,并且从来没有int通过executeUpdate语句传递。

所以在我的例子上述的方式,我解决了这个与下面:

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

我想这是更好地记录,但哦。

+0

为了记录,它似乎并不热衷于我的BOOL,因此numberWithBool:bool为我节省了一天的时间。谢谢你的答案。 – eddieroger 2012-08-01 14:12:39

+0

Tnx,更新后的链接:https://ccgus.github.io/fmdb/html/Classes/FMDatabase.html#//api/name/executeUpdate: – 2015-08-26 06:31:58

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方法,那么您可能需要显式复制该字符串。否则它只会分配值而不复制。

+0

感谢您的回复。我修正了上面的问题,但是它没有解决让值分配给这个对象,然后继承到DrillDownDelegate类,其中saveAllData方法被触发。我知道这个方法是从NSLog语句中触发的,但它没有发现任何脏记录。 (ps。如果你需要更多的数据可以帮助我,请告诉我TKU) – jroyce 2012-01-30 02:28:16

+0

我主要编辑了上面的内容并更改了标题,以便清楚地说明我现在遇到的情况。 – jroyce 2012-01-30 04:33:21