3

私は見つけることができるすべての同様の質問を見てきましたが、それらの解決策はどれも私のために働いていません.

1 つの問題は、JSON を取得して webAPI から解析した後、コンテキストへのエンティティの追加 (成功) とコンテキストの保存が別のスレッドで行われることです。ただし、コンテキストは、次に示すように、manageContext と永続ストアが初めて使用されるときにセットアップされます。したがって、これが発生している解析後のスレッドになります。

正確なエラー:

 *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'This NSPersistentStoreCoordinator has no persistent stores.  It cannot perform a save operation.'

シミュレーターからアプリを削除しようとしましたが、提案されたように変更されませんでした。

これが私が使用しているCoreDataHelperクラスで、アプリにはそのインスタンスが1つしかありません.コンテキストに新しいアイテムを追加した後、ヘルパーでsaveContextメソッドを呼び出すとエラーが発生します:

@implementation CoreDataHelper

@synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;

#pragma mark - Application's Documents directory

// Returns the URL to the application's Documents directory.
- (NSURL *)applicationDocumentsDirectory
{
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory
                                                   inDomains:NSUserDomainMask] lastObject];
}

- (void)saveContext
{
    NSError *error = nil;
    if (self.managedObjectContext != nil) {
        if ([self.managedObjectContext hasChanges] && ![self.managedObjectContext save:&error]) {
            // Replace this implementation with code to handle the error appropriately.
            // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        }
    }
}

- (void)dealloc {

    [self saveContext];
}

#pragma mark - Core Data stack

// Returns the managed object context for the application.
// If the context doesn't already exist, it is created and bound to the persistent store coordinator for the application.
- (NSManagedObjectContext *)managedObjectContext
{
    if (_managedObjectContext != nil) {
        return _managedObjectContext;
    }

    NSPersistentStoreCoordinator *coordinator = self.persistentStoreCoordinator;
    if (coordinator != nil) {
        _managedObjectContext = [[NSManagedObjectContext alloc] init];
        [_managedObjectContext setPersistentStoreCoordinator:coordinator];
    }
    return _managedObjectContext;
}

// Returns the managed object model for the application.
// If the model doesn't already exist, it is created from the application's model.
- (NSManagedObjectModel *)managedObjectModel
{
    if (_managedObjectModel != nil) {
        return _managedObjectModel;
    }
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"];
    _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    return _managedObjectModel;
}

// Returns the persistent store coordinator for the application.
// If the coordinator doesn't already exist, it is created and the application's store added to it.
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (_persistentStoreCoordinator != nil) {
        return _persistentStoreCoordinator;
    }

    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"UserGroupTV.sqlite"];

    NSError *error = nil;
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc]
                                   initWithManagedObjectModel:[self managedObjectModel]];

    // needed for lightweight migrations
    NSMutableDictionary *options = [NSMutableDictionary dictionary];
    [options setObject:[NSNumber numberWithBool:YES]
                forKey:NSMigratePersistentStoresAutomaticallyOption];
    [options setObject:[NSNumber numberWithBool:YES]
                forKey:NSInferMappingModelAutomaticallyOption];

    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
                                                   configuration:nil
                                                             URL:storeURL
                                                         options:options
                                                           error:&error])  {

        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error"
                                                            message:[error localizedDescription]
                                                           delegate:self
                                                  cancelButtonTitle:@"OK"
                                                  otherButtonTitles:nil, nil];
        [alertView show];
    }

    return _persistentStoreCoordinator;
}


@end

ETA: 言及されているのを見ましたが、SQL ファイルを保存しているマシンのローカル フォルダーをどこでどのように削除すればよいですか?

4

2 に答える 2

3

明確な答えはありませんが、次の点を確認してください。

  1. を作成する場所にログを記録しますpersistentStoreCoordinator。作成中にストアを追加するときにエラーが発生した場合は、そこでキャッチできます。

  2. 管理対象オブジェクトのコンテキストをバックグラウンド スレッドに保存しているとのことでした。NSManagedObjectContextスレッドセーフではないため、作成されたスレッドで特定のコンテキストのみを使用する必要があります。スレッドごとに少なくとも 1 つのコンテキストが必要です。「NSManagedObjectContextDidSaveNotification」を観察し、変更をメイン コンテキストにマージできます。

于 2013-04-16T01:38:03.100 に答える