我有一个存储日期的CoreData实体Tracker
。
该应用程序收到通知,CheckListViewController
在CoreData中输入数据最多13天,因此当CheckListViewController被解除时,CoreData实体Tracker
将被填充13行。
在MainViewController
(解散CheckListViewController
)中,我有以下代码:
- (void)dataSaved {
self.checkListVC dismissViewControllerAnimated:YES completion:^{
// fetching all the data from 'Tracker' entity and doing NSLog on it
// all data gets logged in console without any issues
}];
}
现在,在我的代码中的某处之后,我从实体Tracker
获取所有数据,但返回数据为空。 CoreData不会显示任何错误,只返回并清空数组。
编辑: 用于从CoreData获取结果的代码
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:ENTITY];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:NO];
[request setSortDescriptors:@[sortDescriptor]];
request.predicate = (fromDate && toDate) ? [NSPredicate predicateWithFormat:@"date >= %@ AND date <= %@", fromDate, toDate] : nil;
__block NSArray* fetchedHabits;
[managedObjectContext performBlockAndWait:^{
NSError *error = nil;
fetchedHabits = [managedObjectContext executeFetchRequest:request error:&error];
if (error) NSLog(@"Unknown error occurred while fetching results from CoreData, %@ : %@", error, [error userInfo]);
}];
CoreData模型:
更新1 :
因此,您可以看到有两个实体,即Habit
和Tracker
。当我从Habit
获取结果时,一切正常,但当我尝试从Tracker
获取结果时,它会给我一个空数组。我有一个共同的NSManagedObjectContext
实例,因为您可以使用单个managedObjectContext
管理多个CoreData实体。
我检查了managedObjectContext.persistentStoreCoordinator.managedObjectModel.entitiesByName
,它还列出了两个实体。
更新2 :
我将数据添加到Tracker
TrackerCoreData *tracker = [NSEntityDescription insertNewObjectForEntityForName:ENTITY
inManagedObjectContext:managedObjectContext];
tracker.date = date;
tracker.habits = habits;
// saving CoreData explicitly
NSError *error = nil;
[managedObjectContext save:&error];
答案 0 :(得分:0)
您未能显示记录可能有很多原因:
所有这些都可能是复杂的情况,但您应该按此顺序检查它们。
更好的方法:对主视图控制器使用NSFetchedResultsController
,并让委托方法负责更新表视图。无需获取,无需在任何完成方法中完成任务 - 只需保存数据,FRC将更新您的表格。
编辑:如何检查物理数据库
您的数据可能仅存在于内存中,但实际上并未保存到数据库中。找到实际的数据库文件(在模拟器的应用程序的文档文件夹中),并使用sqlite3
命令行实用程序或Firefox插件“SQLite Manager”进行检查。
Edit2:更具体的建议
你应该确保你打电话:
[managedObjectContext save:&error];
同时仔细检查ENTITY
宏代表什么(不是一个非常聪明的名字)。
在我看来,你过度使用块方法没有明显的目的。首先尝试让所有东西都在主线程上工作(一个上下文!)。只有在遇到性能问题时才考虑后台线程和上下文以及对performBlock
等的调用。