簡體   English   中英

托管對象上下文未保存

[英]Managed object context not saved

我正在嘗試使用代表人員的單元格從核心數據加載表格視圖。 這就是我得到上下文的方式:

@property (nonatomic,strong) NSManagedObjectContext* managedObjectContext;

...

- (NSManagedObjectContext*) managedObjectContext {
    if(!_managedObjectContext) {
        NSFileManager* manager= [NSFileManager defaultManager];
        NSURL* URL= [manager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask].firstObject;
        URL= [URL URLByAppendingPathComponent:@"PeopleDocument"];
        UIManagedDocument* document= [[UIManagedDocument alloc]initWithFileURL:URL];

        if([manager fileExistsAtPath:URL.path]) {
            [document openWithCompletionHandler:^(BOOL success) {
            }];
        } else {
            [document saveToURL:URL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
            }];
        }
        NSManagedObjectContext* context= [document managedObjectContext];
        _managedObjectContext= context;
    }
    return _managedObjectContext;
}

然后,在我第一次運行該應用程序時,我會插入一個新實體並保存上下文:

[NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext: self.managedObjectContext];
[self.managedObjectContext save:NULL];

我還嘗試記錄save:的結果,它返回YES並且沒有錯誤。 但是上下文並沒有真正保存:第二次運行應用程序時,獲取的實體數組為空。

更新資料

甚至更陌生的事情發生了:閱讀另一個類似問題的答案 ,我發現了一種強制保存文檔的方法:

- (void) save {
    NSError *error = nil;

    if (![self.managedObjectContext save:&error]) {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    [self.managedDocument saveToURL:self.managedDocument.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:^(BOOL success)
    {
        NSLog(@"Saved: %d",success);
    }];

}

因此,我在首次運行該應用程序時執行以下代碼:

#if FIRST_TIME
    [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext: self.managedObjectContext];
    [self save];
#endif

之后,如果我將FIRST_TIME設置為零,則第二次運行該應用程序時,將得到空記錄。 但是,如果我第三次運行該應用程序,則再次將FIRST_TIME設置為1,那么我會獲得之前創建的所有記錄(以及創建的記錄)。 這意味着,如果我創建並保存新實體,則可以正確提取之前創建的所有實體,否則將不會提取任何實體。

PS:我仔細檢查過:受管對象上下文是self.managedDocument.managedObjectContext返回的self.managedDocument.managedObjectContext

聽起來您在代碼中沒有獲得相同的self.managedObjectContext 您是否再次檢查了在您的方法中訪問的managedObjectContext是否與您在粘貼的第一個方法中創建的第一個相同? 我將逐步介紹這兩種方法,並確保它們是同一對象。

看起來在第一種方法中,您不是在設置self.managedObjectContext而是在設置_managedObjectContext 如果這兩個是同一件事,則文件中的某處應具有以下內容:

@synthesize managedObjectContext = _managedObjectContext;

我只是改變了創建托管對象上下文的方式。 我沒有使用UIManagedDocument ,而是使用alloc + initWithConcurrencyType:創建了上下文,然后將其設置為持久性存儲協調器:

- (NSManagedObjectContext*) managedObjectContext {
    if(!_managedObjectContext) {
        NSURL* URL= [[NSBundle mainBundle] URLForResource:@"People" withExtension:@"momd"];
        NSManagedObjectModel* model= [[NSManagedObjectModel alloc]initWithContentsOfURL:URL];
        NSPersistentStoreCoordinator* storeCoordinator= [[NSPersistentStoreCoordinator alloc]initWithManagedObjectModel: model];
        NSURL* storeURL= [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask].lastObject;
        storeURL= [storeURL URLByAppendingPathComponent:@"MOC.sqlite"];

        NSError* error;
        [storeCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error];
        if(error) {
            NSLog(@"Cannot create new store %@",error);
            return nil;
        }

        _managedObjectContext= [[NSManagedObjectContext alloc]initWithConcurrencyType: NSMainQueueConcurrencyType];
        _managedObjectContext.persistentStoreCoordinator= storeCoordinator;
    }

    return _managedObjectContext;
}

我相信另一種方法也是正確的,但是也許我不得不以另一種方式保存文檔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM