FMDB не вставляется в БД - PullRequest
       3

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

0 голосов
/ 13 августа 2011

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

1 Ответ

4 голосов
/ 13 августа 2011

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

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

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

Удачи!

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

Вставьте это в делегат приложения:

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

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

...