0

我有一个Tracker存储日期的 CoreData 实体。应用程序收到通知并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]);
}];

核心数据模型: 在此处输入图像描述

更新 1:如您所见,有两个实体,即HabitTracker。当我从中获取结果时Habit,一切正常,但是当我尝试从中获取结果时,Tracker它给了我一个空数组。我有一个通用NSManagedObjectContext实例,因为您可以使用单个managedObjectContext. 我已经检查过了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];
4

1 回答 1

0

您无法显示记录的原因可能有很多:

  • 数据未保存
  • 未正确检索数据
  • 数据显示不正确

所有这些都可能是复杂的场景,但您应该按此顺序检查它们。

更好的方法:NSFetchedResultsController用于您的主视图控制器并让委托方法负责更新您的表格视图。无需获取,无需在任何完成方法中完成任何工作 - 只需保存数据,FRC 就会更新您的表。

编辑:如何检查物理数据库
您的数据可能只存在于内存中,但实际上并未保存到数据库中。找到实际的数据库文件(在模拟器的应用程序的文档文件夹中)并使用sqlite3命令行实用程序或 Firefox 插件“SQLite Manager”检查它。

Edit2:更具体的建议
您应该确保致电:

[managedObjectContext save:&error]; 

还要仔细检查你的ENTITY宏代表什么(不是一个非常聪明的名字)。

在我看来,您过度使用块方法没有明显的目的。首先尝试使一切都在主线程上工作(一个上下文!)。仅当您遇到性能问题时,才考虑后台线程和上下文以及对performBlock等的调用。

于 2013-08-07T09:30:23.400 回答