0

私はこのアプリを iPhone 用に作成しており、sqlite を使用する必要があります。sqlite に大量のデータを事前にロードし、その sqlite ファイルをプロジェクト フォルダーにコピーしました。アプリを起動すると、sqlite データ ファイルがシミュレーターのアプリ ファイル (ドキュメントの場所) にコピーされていないようです。これが私のコードです:

    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDir = [paths objectAtIndex:0];

    NSString *dbPath = [documentsDir stringByAppendingPathComponent:@"moviedbl.data"];
    BOOL success = [fileManager fileExistsAtPath:dbPath];

    if(!success){
        NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent: @"moviedbl.data"];
        //NSString *defaultDBPath = [[NSBundle mainBundle] pathForResource:@"moviedbl" ofType: @"data"];
        success = [fileManager copyItemAtPath:defaultDBPath toPath:dbPath error:&error];

        if(!success){
            NSAssert1(0, @"Failed to create writable database file with message '%'.", [error localizedDescription]);
        }
    }

defaultDBPath は、シミュレーターの app フォルダーを参照しているようです。このフォルダーには、もともと sqlite ファイルが含まれておらず、実際には sqlite ファイルがコピーされるのを待っています。私が理解していることから、ファイルをコピーするには、バンドルからファイルを取得し (バンドルがプロジェクト フォルダーを参照しているかどうかはわかりませんが、プロジェクト フォルダーであると仮定しました)、シミュレーターにコピーする必要があります。私はこれで何日も立ち往生しています。教えてください...よろしくお願いします!!!

更新:結局、実際に機能するようになりました。最初はmainBundleなどからファイルをコピーしていないからだと思っていたのですが、パスにある.appの実体フォルダを開いたところコピーしていたことが判明。データベースが実際に含まれていることがわかりました。奇妙なことに、ファイルの種類がないのですが、xCode ではファイルの種類が "data" と表示されるため、ofType: @"data" を使用し続けました。最終的に ofType: @"" に変更したところ、うまくいきました! いずれかの方法!愚かな私ですが、助けようとした皆さんに感謝します!! :D

4

1 に答える 1

1
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [paths objectAtIndex:0];

NSString *dbPath = [documentsDir stringByAppendingPathComponent:@"moviedbl.data"];

if([fileManager fileExistsAtPath:dbPath]==NO){

    NSString *defaultDBPath = [[NSBundle mainBundle] pathForResource:@"moviedbl" ofType: @"data"];
   BOOL success = [fileManager copyItemAtPath:defaultDBPath toPath:dbPath error:&error];

    if(!success){
        NSAssert1(0, @"Failed to create writable database file with message '%'.", [error localizedDescription]);
    }
}
于 2012-06-06T09:51:45.873 に答える