【问题标题】:Core Data fetchedObjects data = nil except for last entryCore Data fetchedObjects data = nil 除了最后一个条目
【发布时间】: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 数据库中读取我的数据时,谁能阐明我的数据发生了什么?

【问题讨论】:

    标签: ios objective-c sqlite core-data


    【解决方案1】:

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

    【讨论】:

    • 当您说日志特定属性时,这与我在上面所做的 NSLog 有何不同?
    • 那是因为Core Data总是在后台优化。它将获取绝对最小值并仅在必要时填写空白。这称为Faulting。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 2010-11-07
    • 1970-01-01
    • 2012-02-11
    • 1970-01-01
    相关资源
    最近更新 更多