0

質問のタイトルは自明ではないかもしれませんが、要約する方法がわかりません。

基本的にDBであるアプリを完成させています。アプリ内のDBを出荷します。すべてがうまくいきますが、今私は問題に来ました。アプリをインストールしたら、デバイスにデータベースを作成する必要があります。そのため、DB を Xcode プロジェクトの "Supporting Files" フォルダーにドラッグしました (ちなみに、まだ Xcode 4.1 です)。AppDelegate.m ファイルに移動し、(NSPersistentStoreCoordinator *)persistentStoreCoordinator{} メソッドを探しました。

私は行を置き換えました:

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Database.sqlite"];

このコードの場合:

    NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"Database.sqlite"];
NSLog(@"%@", storePath);

NSURL *storeURL = [NSURL fileURLWithPath:storePath];

    // Put down default db if it doesn't already exist
NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath:storePath]) {
    NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"Database" ofType:@"sqlite"];
    if (defaultStorePath) {
        [fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL];
    }
}

Ray Wenderlich のチュートリアルから入手しました。

問題は、コンパイラが行に警告を表示することです

NSString *storePath = [[self applicationDocumentsDirectory] ​​stringByAppendingPathComponent: @"Database.sqlite"];

それは、「NSURL が 'stringByAppendingPathComponent' に応答しない可能性があり、実際には、それが原因でアプリがクラッシュする可能性があることを示しています。興味深いことに、チュートリアルの例では警告がまったく表示されません。

誰かが私に欠けているものに手を差し伸べることができますか?

前もって感謝します!

4

1 に答える 1

2

[self applicationDocumentsDirectory] ​​が NSString を返しますか? そうでない場合は、これを試してください

- (NSString *)applicationDocumentsDirectoryString {

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
    return basePath;
}

[self applicationDocumentsDirectory] ​​を [self applicationDocumentsDirectoryString] に変更します。

于 2011-11-15T21:51:50.083 に答える