5

UIManagedDocumentに基づいてアプリに永続ストアをプリロードして、コアデータを処理しようとしています。

私がアプリBで使用しようとしている永続ストアは、アプリAのおかげで「生成」され、入力されます。アプリAとBIの両方で、Justin DriscollのUIManagedDocumentハンドラーを使用します( Mister Driscollに感謝します!)。すべてアプリAで完全に機能します。

このスレッドで説明されている手法に基づいて:UIManagedDocumentを使用してiOS 5にコアデータデータベースをプリロードし、永続ストアをBのアプリバンドルに配置し、必要に応じてこのストアをドキュメントフォルダーにコピーしようとします(実行されていない場合) before)インスタンス化する直前のinit。

バンドルからドキュメントへのコピーはすべて問題ありませんが(別の方法を試し、ファインダーとnslogのおかげで作成を確認しました)、「ドキュメント」を開くことができません。アプリはクラッシュせず、ビューは表示されますが、テーブルは空です(アプリAとまったく同じコードを使用し、同じfetchedResultsControllerを使用します)。最初に、コピーされた永続ストアが空だと思った後、ドキュメント/コピーされた永続ストアを正しく開くことができないことに気付きました)=>ドキュメントの状態= 5、つまりUIDocumentStateClosedとUIDocumentStateSavingErrorのエラー(正しく解釈した場合??? )。

(注:バンドルから直接ドキュメントをインスタンス化して開くことも試みましたが、同じ問題が発生しました:doc state = 5)

だから...このドキュメントの状態と戦う3日間=5で、何を修正するかについての手がかりはありません

アプリBのバンドルに入れたファイルに何か問題があると思います(現在、[追加されたフォルダーのフォルダー参照を作成する]を選択してファインダーからxcodeにドラッグアンドドロップします)おそらく、いくつかのオプション、メタデータ、またはファイルに関するものです権限または...

何を調査するかについて何か考えはありますか?

(次のコードについてではないと思いますが...)これが私が初期化する方法です(Justin Driscollハンドラーに基づいています。custoのみです:ドキュメントフォルダーにストアパッケージがあるかどうかを確認します。そうでない場合は、ベースで作成しますバンドル内のファイル)

- (id)init
{
self = [super init];
if (self) {
    self.document = nil;

    NSLog(@"--- INIT ---");

    // On vérifie si il y a un dossier "My-Default-Document-As-Database" (notre persitent store) dans le dossier "Documents"

    NSString *docDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString *docFolderPath = [docDirectory stringByAppendingPathComponent:@"My-Default-Document-As-Database"];

    if (![[NSFileManager defaultManager] fileExistsAtPath:docFolderPath]) {
        NSError *error = nil;
        NSLog(@"Pas de fichier trouvé à l'adresse docFolderPath, on va donc y créer notre persistent store");

        // COPY FROM BUNDLE

        NSFileManager *fileManager = [NSFileManager defaultManager];

        NSString *DB = [docFolderPath stringByAppendingPathComponent:@"StoreContent"];

        [fileManager createDirectoryAtPath:DB withIntermediateDirectories:YES attributes:nil error:&error];

        NSLog(@"create directory error: %@",error);

        DB = [DB stringByAppendingPathComponent:@"persistentStore"];

        NSString *shippedDB = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"persistentStore"];

        NSLog(@"%d",[fileManager fileExistsAtPath:shippedDB]);

        [fileManager copyItemAtPath:shippedDB toPath:DB error:&error];

        NSLog(@"Copy error %@",error);

    }

    NSLog(@"== My-Default-Document-As-Database OK DANS DOCUMENTS ==");

    NSURL *myDbUrl = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];

    myDbUrl = [myDbUrl URLByAppendingPathComponent:@"My-Default-Document-As-Database/"];

    self.document = [[UIManagedDocument alloc] initWithFileURL:myDbUrl];

    NSLog(@"== initWithFileUrl ==");

            // Set our document up for automatic migrations
            NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                                     [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                                     [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
            self.document.persistentStoreOptions = options;


            // Register for notifications
            [[NSNotificationCenter defaultCenter] addObserver:self
                                                     selector:@selector(objectsDidChange:)
                                                         name:NSManagedObjectContextObjectsDidChangeNotification
                                                       object:self.document.managedObjectContext];

            [[NSNotificationCenter defaultCenter] addObserver:self
                                                     selector:@selector(contextDidSave:)
                                                         name:NSManagedObjectContextDidSaveNotification
                                                       object:self.document.managedObjectContext];
}
return self;
}

Driscoll氏によって提供されたperformWithDocumentコードに対して行った「変更」のみが、何が起こっているかを確認するためのnslogです(最初に開いた試行ごとにドキュメントの状態が1から5になり、その後5に固執します...)

- (void)performWithDocument:(OnDocumentReady)onDocumentReady
{  
NSLog(@"passage par performWithDoc");

void (^OnDocumentDidLoad)(BOOL) = ^(BOOL success) {
    NSLog(@"FilePath Apres = %@",[self.document.fileURL path]);
    NSLog(@"STATE === %d", self.document.documentState);
    onDocumentReady(self.document);
};

NSLog(@"FilePath Avant = %@",[self.document.fileURL path]);
NSLog(@"STATE === %d", self.document.documentState);

if (![[NSFileManager defaultManager] fileExistsAtPath:[self.document.fileURL path]]) {
    [self.document saveToURL:self.document.fileURL
            forSaveOperation:UIDocumentSaveForCreating
           completionHandler:OnDocumentDidLoad];
    NSLog(@"performWithDoc > fileexistAtPath nope => saveToURLForCreating");
    NSLog(@"STATE === %d", self.document.documentState);
} else if (self.document.documentState == UIDocumentStateClosed) {
    [self.document openWithCompletionHandler:OnDocumentDidLoad];
    NSLog(@"performWithDoc > UIDocStateClosed => openWithCompletionHandler");
    NSLog(@"STATE === %d", self.document.documentState);
} else if (self.document.documentState == UIDocumentStateNormal) {
    OnDocumentDidLoad(YES);
    NSLog(@"performWithDoc > docState = normal => docdidLoad(YES)");
}
NSLog(@"STATE === %d", self.document.documentState);
}
4

1 に答える 1

2

コンパドラスゴのおかげで、ここに答えがあります...誰かがそれを検索した場合:

それはオプションについてでした!

NSIgnorePersistentStoreVersioningOptioninitのpesistenStoreオプションに追加します。

以前のコードに関しては、次のようなものが必要です。

// Set our document up for automatic migrations
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
    [NSNumber numberWithBool:YES], NSIgnorePersistentStoreVersioningOption,
    [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
    [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
self.document.persistentStoreOptions = options;
于 2013-01-22T09:56:09.703 に答える