Core Data fetchedObjects data = nil 除了最后一个条目

Posted

技术标签:

【中文标题】Core Data fetchedObjects data = nil 除了最后一个条目【英文标题】:Core Data fetchedObjects data = nil except for last entry 【发布时间】:2015-05-15 23:21:03 【问题描述】:

我最近发现我的 Core Data 存储变得非常混乱,所以我决定删除它。在这里搜索我使用以下代码删除我的数据

NSManagedObjectContext *context = [self managedObjectContext];
NSError *error;
NSFetchRequest * allData = [[NSFetchRequest alloc] init];
[allData setEntity:[NSEntityDescription entityForName:@"TimeLineItem" inManagedObjectContext:context]];
[allData setIncludesPropertyValues:NO]; //only fetch the managedObjectID

NSArray * datas = [context executeFetchRequest:allData error:&error];
//error handling goes here
for (NSManagedObject * data in datas) 
    [context deleteObject:data];

NSError *saveError = nil;
[context save:&saveError];

一切顺利。然后我把删除代码注释掉,打开下面的代码在store中创建一个占位符数据,并查看数据(本例中是我刚刚创建的)

    NSManagedObjectContext *context = [self managedObjectContext];
TimeLineItem *timeLineItem = [NSEntityDescription
                                  insertNewObjectForEntityForName:@"TimeLineItem"
                                  inManagedObjectContext:context];
timeLineItem.locationName = @"Test Bank2";
timeLineItem.date = [NSDate date];
NSError *error;
if (![context save:&error]) 
    NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);


NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"TimeLineItem"
                                          inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
for (TimeLineItem *info in fetchedObjects) 
    NSLog(@"loc: %@", info.locationName);
    NSLog(@"Date: %@", info.date);

仍然没有问题。但是在下一次运行时,假设我将虚拟数据输入行留在其中,只有最后一个(刚刚创建的最新虚拟数据)返回为非零。见附图(假设只有 2 个获取的对象而不是 6 个,因为对象 [0]-[3] 都与 [4] 相同 - 无)。

nil fetched objects

我也直接查看了sqlite数据库,数据都很好:

sqlite data view

在启动后从 sqlite 数据库中读取我的数据时,谁能阐明我的数据发生了什么?

【问题讨论】:

【参考方案1】:

让您恼火的nil 属性只是显示在调试器中,因为尚未获取详细信息。如果您遍历您的结果并记录特定属性,例如locationName,您会看到它就在那里。

【讨论】:

当您说日志特定属性时,这与我在上面所做的 NSLog 有何不同? 那是因为Core Data总是在后台优化。它将获取绝对最小值并仅在必要时填写空白。这称为Faulting。

以上是关于Core Data fetchedObjects data = nil 除了最后一个条目的主要内容,如果未能解决你的问题,请参考以下文章

NSFetchedResultsController fetchedObjects 的深度

NSFetchedResultsController:在调用 -performFetch 之前,我是不是应该始终检查 fetchedObjects==nil?

RestKit 和 fetchedResultsController performFetch 成功但 fetchedObjects 为空

fetchedResultsController.fetchedObjects 在 iOS 10 beta 1 和 Swift 2.3 上崩溃

NSFetchedResultsController fetchedObjects 返回 nil

performFetch后fetchedObjects为nil,但tableView有数据