-2

次のコードを使用して、一時書き込みファイルを作成するためだけにデータベースファイルを他のフォルダーにコピーしています。

BOOL success;
NSArray*dirPath;
NSString*docDir;
NSString*databasePath;
NSString*databaseName=@"EXPENSES";

//path for database
dirPath=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
docDir=[dirPath objectAtIndex:0];
databasePath=[docDir stringByAppendingPathComponent:databaseName];

NSLog(@" docDir %@",docDir);
//check if present
NSFileManager*fm=[NSFileManager defaultManager];
success=[fm fileExistsAtPath:databasePath];

if(success)
{
    NSLog(@"DATA BASE Already present");
}
else
{

    //Copy from bundle to DocumentsDirectory on first run. Where DB won't be available in DocumentsDirectory.
    NSString*bundlePath=[[NSBundle mainBundle] pathForResource:@"EXPENSES" ofType:@""];
    NSError*error;
    success=[fm copyItemAtPath:bundlePath toPath:databasePath error:&error];

    if(success)
    {
        NSLog(@"DATA BASE Created successfully");
    }

} // End of else when DB not present in documents directory.

しかし、ファイルがコピーされていない代わりに、アプリがエラーでクラッシュしています

4

3 に答える 3

1

ここで 2 つの間違いを犯しています。

  1. 宛先ファイル拡張子について言及していませんでした

    それ以外のNSString*databaseName=@"EXPENSES";

    使用するNSString*databaseName=@"EXPENSES.sqlite";

  2. このコードは実際の問題です:

    NSString*bundlePath=[[NSBundle mainBundle] pathForResource:@"EXPENSES" ofType:@""];
    

NSFileManagerここでは、次の名前のファイルを検索するように指示しています。その"EXPENSES"拡張子は""、おそらくこれらの基準を持つファイルはありません。したがって、ソース パスは になりますnil。そのため、アプリケーションがクラッシュしています。

通常、データベース ファイルの拡張子はsqlite. コードを次のように置き換えます。

NSString*bundlePath=[[NSBundle mainBundle] pathForResource:@"EXPENSES" ofType:@"sqlite"];
于 2012-12-04T08:20:58.970 に答える
0

私はその問題から抜け出しました。その背後にあるロジックがわかりません。SVN から新しいデータベースをエクスポートし、プロジェクト バンドルに完全に正常に動作するように追加しました。

于 2012-12-05T10:56:59.770 に答える
0

ofType のバンドル データベース拡張機能を追加してみてください。
NSString*bundlePath=[[NSBundle mainBundle] pathForResource:@"EXPENSES" ofType:@"<extension>"];このエラーは、指定されたファイルが見つからないことを示しています。

于 2012-12-04T07:47:19.713 に答える