Сохранение в базу данных с помощью FMDB дает сбой при интерпретации NSInteger

3

Когда вызывается функция ниже, я получаю сбой 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

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

  • 0
    Вы устанавливаете значение заголовка и значение заголовка категории для объекта Subject. Но где вы сохраняете объект в базе данных?
  • 0
    Я обновил это, чтобы включить функцию saveAllData, которая сохраняет объект в базе данных. Но проблема в том, что он даже не делает этого, поскольку данные не остаются с объектом. Я думаю, что моя проблема в том, что я неправильно вызываю функции setTitle и setCategory_Title, так как эти методы никогда не касаются при запуске в отладчике ...
Теги:
xcode
fmdb

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]];

Я хотел, чтобы это было лучше документировано, но хорошо.

  • 0
    Для протокола, мне тоже не понравился мой BOOL, так что numberWithBool: bool спас мне день. Спасибо за ответ.
  • 0
    Tnx, обновленная ссылка: ccgus.github.io/fmdb/html/Classes/FMDatabase.html#//api/name/… :
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)
  • 0
    Я в основном отредактировал вышеизложенное и изменил название, чтобы оно четко указывало на то, с чем я столкнулся сейчас.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню