0

私は過去 4 時間にわたって解決策を探していましたが、必死になって投稿しています。私のアプリは、データ モデルの 1 つに属性を追加するまで、シミュレーター、iPhone、および iPad で完全に動作していました。

私の iPhone アプリケーションは Core Data と iCloud を使用しています。AppDelegate では、2 つのモデルをマージして managedObjectModel を作成します。ManagedObjectContext を保存しようとするまで、すべて問題ないようです。そのとき、次のようにクラッシュします。

*キャッチされない例外 'NSInternalInconsistencyException' が原因でアプリを終了しています。理由: 'この NSPersistentStoreCoordinator には永続ストアがありません。保存操作を実行できません。

これは、シミュレーターでは発生しません。

私が試してみました:

  • プロジェクト - >クリーンビルドフォルダー
  • プロジェクト->クリーン
  • デバイスからアプリを削除する
  • iCloudバックアップからiCloudデータを削除する
  • コンピュータを再起動する
  • 「.momd」を「.mom」に変更し、元に戻しました(別の質問でそれについて読んでください)

助けてくれてありがとう。

コードを追加する編集:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (__persistentStoreCoordinator != nil) {
    return __persistentStoreCoordinator;
}

__persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];    
NSPersistentStoreCoordinator *psc = __persistentStoreCoordinator;

// TODO: Set up iCloud in another thread:
//dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSString *dataFileName = [NSString stringWithFormat:@"%@.sqlite", APP_TITLE_NO_SPACES];

NSString *iCloudDataDirectoryName = @"Data.nosync";
NSString *iCloudLogsDirectoryName = @"Logs";
NSFileManager *fileManager = [NSFileManager defaultManager];        
NSURL *localStore = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:dataFileName];
NSURL *iCloud = [fileManager URLForUbiquityContainerIdentifier:nil];

if (iCloud) {
    NSURL *iCloudLogsPath = [NSURL fileURLWithPath:[[iCloud path] stringByAppendingPathComponent:iCloudLogsDirectoryName]];
    if([fileManager fileExistsAtPath:[[iCloud path] stringByAppendingPathComponent:iCloudDataDirectoryName]] == NO) {
        NSError *fileSystemError;
        [fileManager createDirectoryAtPath:[[iCloud path] stringByAppendingPathComponent:iCloudDataDirectoryName] 
               withIntermediateDirectories:YES 
                                attributes:nil 
                                     error:&fileSystemError];
        if(fileSystemError != nil) {
            NSLog(@"Error creating database directory %@", fileSystemError);
        }
    }

    NSString *iCloudData = [[[iCloud path] 
                             stringByAppendingPathComponent:iCloudDataDirectoryName] 
                            stringByAppendingPathComponent:dataFileName];

    NSLog(@"iCloudData = %@", iCloudData);

    NSDictionary* options = [NSDictionary dictionaryWithObjectsAndKeys:
                             [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                             [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
                             CLOUD_CONTAINER_IDENTIFIER, NSPersistentStoreUbiquitousContentNameKey,
                             iCloudLogsPath, NSPersistentStoreUbiquitousContentURLKey, nil];

    [psc lock];
    [psc addPersistentStoreWithType:NSSQLiteStoreType 
                      configuration:nil 
                                URL:[NSURL fileURLWithPath:iCloudData] 
                            options:options 
                              error:nil];
    [psc unlock];
} else {
    NSLog(@"iCloud is NOT working - using a local store");
    NSMutableDictionary *options = [NSMutableDictionary dictionary];
    [options setObject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption];
    [options setObject:[NSNumber numberWithBool:YES] forKey:NSInferMappingModelAutomaticallyOption];

    [psc lock];

    [psc addPersistentStoreWithType:NSSQLiteStoreType 
                      configuration:nil 
                                URL:localStore 
                            options:options 
                              error:nil];
    [psc unlock];
}
__persistentStoreCoordinator = psc;

[[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_ICLOUD_SOMETHING_CHANGED object:nil];

return __persistentStoreCoordinator;

}

4

1 に答える 1

0

通常、プログラム データを削除すれば問題ありません。ただし、エラーは、矛盾はなく、ストアがまったくないことを示しています。前提: 障害が発生した場合に再起動しないこと。おそらく、次のコードが役立つ場合があります。

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator

{
    if (__persistentStoreCoordinator != nil) {
        return __persistentStoreCoordinator;
    }
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"myApp.sqlite"];

    NSError *error = nil;
    __persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
        // Error, erase data
        [[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil];
        NSLog(@"store cleaned");
        __persistentStoreCoordinator = nil;
        return [self persistentStoreCoordinator];
    }    
    return __persistentStoreCoordinator;
} 
于 2012-04-26T05:46:54.473 に答える