Когда вызывается функция ниже, я получаю сбой EXC_BAD_ACCESS. Похоже, что в FMDB возникает проблема с интерпретацией subject_id NSInteger, поскольку она проходит через два NStrings и бомбы, когда попадает в этот столбец subject_id в предложении WHERE.
- (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
(Примечание: я отредактировал это в основном, когда выяснил остальную часть.)
Хорошо, я решил. FMDB не будет работать с использованием целых чисел. Вы должны преобразовать их в Числа. Я нашел это в примерах в документе FMDB, и никогда не передается int через оператор executeUpdate.
Итак, в моем примере выше, как я исправил это, было следующее:
[database executeUpdate:@"update Subject Set subject = ?, category = ? where subject_id = ?", self.title, self.category_title, [NSNumber numberWithInt:self.subject_id]];
Я хотел, чтобы это было лучше документировано, но хорошо.
Я не знаю, откуда вы вызываете метод 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, вам может потребоваться явно скопировать строку. Иначе он просто назначит значение без копирования.