0


FMDBを使用してDBにいくつかのクエリを挿入しようとしています。
挿入のクエリを確認すると、挿入していると表示されます。
後で、実際にテーブルからデータを読み取ることができます。
しかし、DBから情報を読み取ろうとすると、nullとして返されます。
XcodeプロジェクトでDBを確認したところ、更新されていないようです。
ちょっと混乱します。問題が何である可能性があるかについての提案はありますか?

4

1 に答える 1

4

あなたのコードは間違っています。これは私が書くために使用するものです:

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

最初にデータベースをプロジェクトツリーに配置してください。

于 2011-08-13T12:45:31.287 に答える