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