FMDB не вставляется в БД


Я пытаюсь использовать FMDB для вставки нескольких запросов в БД.
Когда я проверяю запрос на вставку, он говорит, что он вставляется.
Позже я смогу прочитать данные из таблиц.
Но происходит следующее: если я пытаюсь прочитать информацию из БД, она возвращается как нуль.
Когда я проверил БД в проекте Xcode, похоже, она не обновилась.
Это немного сбивает меня с толку. Любое предложение, в чем может быть проблема?


person Mush    schedule 13.08.2011    source источник
comment
Используете ли вы db.traceExecution = YES и db.logsErrors, чтобы проверить, что происходит?   -  person Thomas K    schedule 13.08.2011
comment
Только что проверил как db.traceExecution, так и db.logsErrors. Не показывает ошибок и показывает транзакции.   -  person Mush    schedule 13.08.2011
comment
Не могли бы вы опубликовать код, который вы используете для чтения из БД?   -  person Thomas K    schedule 13.08.2011
comment
NSFileManager *fileManager = [NSFileManager defaultManager]; NSError * ошибка; NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@mydatabase.db]; база данных = [FMDatabase databaseWithPath: defaultDBPath]; FMResultSet *rs = [база данных executeQuery:@SELECT * FROM myList]; if([база данных открыта]) { while ([rs next]) { NSLog(@%@ %@ %@ %@ %@, [rs stringForColumn:@my_id], [rs stringForColumn:@my_name], [rs stringForColumn: @my_loc]); } [закрыть]; [база закрыта]; }   -  person Mush    schedule 13.08.2011
comment
Я кое-что заметил, где находится БД в симуляторе iPhone. В нем нет стола.   -  person Mush    schedule 13.08.2011


Ответы (1)


Ваш код неверен. Это то, что я использую, чтобы написать:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *dbPath = [documentsDirectory stringByAppendingPathComponent:@"db.sqlite"];

FMDatabase *db = [FMDatabase databaseWithPath:dbPath];
[db open];

[db executeUpdate:@"INSERT INTO foo (bar) VALUES (?)", bar];

[db close];

И читать:

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *dbPath = [documentsDirectory stringByAppendingPathComponent:@"db.sqlite"];

    FMDatabase *db = [FMDatabase databaseWithPath:dbPath];
    [db open];

    NSMutableArray *bar = [[[NSMutableArray alloc] init] autorelease];

    FMResultSet *s = [db executeQuery:@"select * from foo"];
    while ([s next]) {

        [bar addObject:[s stringForColumn:@"bar"]];

    }

    NSLog(@"%@", bar);

    [db close];

Также проверьте, где я нашел файл db. Я думаю, что ваш способ будет работать на симуляторе, но не на устройстве из-за песочницы и всего остального.

Удачи!

РЕДАКТИРОВАТЬ:

Поместите это в свой делегат приложения:

- (void)createEditableCopyOfDatabaseIfNeeded {


    // First, test for existence.
    BOOL success;
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"db.sqlite"];
    success = [fileManager fileExistsAtPath:writableDBPath];
    if (success) return;
    // The writable database does not exist, so copy the default to the appropriate location.
    NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"db.sqlite"];
    success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];
    if (!success) {
        NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);
    }
}

И запустите этот метод из application:didFinishLaunchingWithOptions с помощью:

[self performSelector:@selector(createEditableCopyOfDatabaseIfNeeded) withObject:nil];

Убедитесь, что вы сначала поместили свою базу данных в дерево проектов.

person Thomas K    schedule 13.08.2011
comment
Спасибо, я попробую. - person Mush; 13.08.2011
comment
Да. Не вставляется в БД. Может ли это быть путь к моей БД? У меня в корневой папке. - person Mush; 13.08.2011