Сохранение в базу данных с помощью FMDB дает сбой при интерпретации NSInteger - PullRequest
3 голосов
/ 27 января 2012

Когда вызывается следующая функция, я получаю аварийное завершение EXC_BAD_ACCESS.Похоже, что у FMDB возникла проблема с интерпретацией NSInteger subject_id, поскольку он проходит через две строки 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

(Примечание: я редактировал это в основном, как выяснил остальное.)

Ответы [ 2 ]

8 голосов
/ 30 января 2012

Хорошо, я решил это. 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]];

Хотелось бы, чтобы это было лучше задокументировано, ну да ладно.

2 голосов
/ 28 января 2012

Я не знаю, откуда вы вызываете метод 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. Если вы переопределите метод установки, вам может потребоваться явно скопировать строку. В противном случае он просто присвоит значение без копирования.

...