1

最初のアプリケーションの起動時にデータベースファイルを作成しようとしています。FMDBライブラリを使用しました。この目的のために、データベースファイルがすでに存在するかどうかを確認しています。存在しない場合は、プロジェクトからデータベースファイルをコピーします。私のコード:

-(void)checkAndCreateDatabase {
NSLog(@"check and create database doing");
NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *dbFileName = [docDir stringByAppendingPathComponent:@"FriendsDatabase.sqlite3"];
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;

if (![fileManager fileExistsAtPath:dbFileName]) {
    [fileManager copyItemAtPath:[[NSBundle mainBundle] pathForResource:@"FriendsDatabase" ofType:@"sqlite3"] toPath:dbFileName error:&error];
    NSLog(@"database created");
} else {
    NSLog(@"fail to create database");
}

FMDatabase  *_db = [[FMDatabase alloc] initWithPath: dbFileName];
if (![_db open]) {
    [_db release];
    NSLog(@"Could't open DB");
    }
_db.logsErrors = NO;

self.db = _db;
[_db release];
}

しかし、エラーがあります:'NSInvalidArgumentException', reason: '*** -[NSFileManager copyItemAtPath:toPath:error:]: source path is nil'。私が間違っているのは何ですか?

4

2 に答える 2

2

メインバンドルに「FriendsDatabase.sqlite3」という名前のファイルがないようです。(もしあれば、への呼び出しのソースパスは-copyItemAtPath:toPath:error:nilにはなりません。)

次のようにコードを変更してみてください。

NSString *path = [[NSBundle mainBundle] pathForResource:@"FriendsDatabase" ofType:@"sqlite3"];
[fileManager copyItemAtPath:path toPath:dbFileName error:&error];

次に、デバッガーを使用してコードをステップ実行し、の値を確認しますpath

コード内のファイルの名前として「FriendsDatabase」(「s」に注意)を指定しましたが、コメントではファイルを「FriendDatabase」と呼んでいることに注意してください。コード内のファイル名のつづりを間違えた可能性があります。これが定数を使用する理由です。

于 2012-05-22T21:20:21.587 に答える
1

カレブの答えは正しいですが、sqlite3ファイルがターゲットのメンバーであることを確認する必要があることを付け加えておきます。XCodeで、sqlite3ファイルを選択し、[ターゲットメンバーシップ]の下の[ファイルインスペクター]パネル(右側のパネル)を開きます。ターゲットアプリがチェックされていることを確認してください。

于 2012-05-23T03:39:48.353 に答える