将数据添加到CoreData后,CoreData会被清空

时间:2013-08-07 07:44:38

标签: ios objective-c core-data nsmanagedobjectcontext

我有一个存储日期的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模型: enter image description here

更新1 : 因此,您可以看到有两个实体,即HabitTracker。当我从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];

1 个答案:

答案 0 :(得分:0)

您未能显示记录可能有很多原因:

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

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

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

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

Edit2:更具体的建议
你应该确保你打电话:

[managedObjectContext save:&error]; 

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

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