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