0

私はこの問題に 1 週​​間取り組んできましたが、Google でスタック オーバーフローを検索し、約 40 件の投稿を読みましたが、まだ問題を解決できません。1. sqlite データベースを作成し、データをプリロードするためのテスト アプリを作成しました。2.myApp を作成し、プリロードされた DB をリソース フォルダーにコピーしました。3.DBを取得するために次のコードを書きました:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    if (!self.myDataBase) {
        NSURL *url = [self localDocumentsDirectoryURL];
        url = [url URLByAppendingPathComponent:@"myDB/"];
        self.myDataBase = [[UIManagedDocument alloc] initWithFileURL:url];
    }

    return YES;
}

-(NSURL*)localDocumentsDirectoryURL {
    static NSURL *localDocumentsDirectoryURL = nil;
    if (localDocumentsDirectoryURL == nil) {
        NSString *documentsDirectoryPath = [NSSearchPathForDirectoriesInDomains( NSDocumentDirectory,NSUserDomainMask, YES ) objectAtIndex:0];
        localDocumentsDirectoryURL = [NSURL fileURLWithPath:documentsDirectoryPath];
    }
    return localDocumentsDirectoryURL;
}

- (void)useDocument
{
    if (![[NSFileManager defaultManager] fileExistsAtPath:[self.ICCarDataBase.fileURL path]]) 
    {
        [self.ICCarDataBase saveToURL:self.ICCarDataBase.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {}];
    } 
    else
    {

        [self.ICCarDataBase openWithCompletionHandler:^(BOOL success) {}];
    }
}

- (void) setICCarDataBase:(UIManagedDocument *)carDataBase
{
    if (_ICCarDataBase != carDataBase) {
        _ICCarDataBase = carDataBase;
        [self useDocument];
    }
}

次に、シミュレーターで myApp を実行すると、myApp は DB データを正常に取得し、iPhone で実行すると myApp は DB データを取得できません。SDK のバージョンが重要かどうかはわかりませんが、シミュレーターは iphone 5.1 で、私の iPhone は 5.0 (ジェイルブレイク) です。また、アプリで 5.1 固有の機能を使用していません。

最初にDataBaseをドキュメントディレクトリにコピーして機能させる必要があると言う人もいます。私は解決策を試しましたが、シミュレーターでは問題なく動作しますが、iPhoneにはデータがありません。さらに、iTool を使用して iphone フォルダーを調べたところ、myDB フォルダーは既にドキュメント dir にあります。投稿では、ソリューションがここにあることを示唆しています: UIManagedDocument を使用して iOS 5 にコア データ データベースをプリロードする

他の人は、persistentStoreCoordinator を直接使用する必要があると言っています。しかし、暗黙のpersistentStoreCoordinator自体を作成するため、UIManagedDocumentは私の状況で機能すると思います。

myApp の何が問題なのかについて何か提案はありますか?

そして、iosがsqlite DBを2層のフォルダーでラップし、実際のsqlite db persisentStoreに名前を付ける理由を誰でも教えてくれますか?

4

1 に答える 1

0

この投稿のおかげで、この問題を解決しましたiPhone: Can access files in documents directory in Simulator, but not device

この投稿で、彼はこのブログを参照しました: Xcode resource groups and folder references when building for iPhone

私の問題を解決した後、sqliteデータベースのプリロードがデバイスで機能しない理由に気づきました.Xcodeがデータベースをバンドルからデバイスにコピーすると、persistentStoreをラップするフォルダー層(myDB/StoreContent/persistentStore)が削除されました。そのため、myApp.app バンドル内のデバイスには、persistentStore ファイルだけが他のすべてのファイルと混在しています。また、UIManagedDocument を使用して sqlite データベースにアクセスする場合、myDB/StoreContent/persistentStore のようなディレクトリ構造の sqlite でのみ機能します。したがって、裸のpersistentStoreファイルのみを使用すると、UIManagedDocumentは空のpersistentStoreを含むまったく新しいディレクトリ構造を作成します。

UIManagedDocument がフォルダー層なしでpersistentStoreファイルを操作する方法を誰かが提案できれば、私は興味があります。

そして、デバイス バンドルのディレクトリ構造を正常に複製した後、次のコードを使用して DB にアクセスします。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    if (!self.myDataBase) {
        NSURL *url = [[NSBundle mainBundle] resourceURL];
        url = [url URLByAppendingPathComponent:@"myDB/"];
        self.myDataBase = [[UIManagedDocument alloc] initWithFileURL:url];
    }

    return YES;
}
于 2012-09-17T02:49:11.523 に答える