导致数据消失的核心数据后台任务



我对核心数据有一个奇怪的问题。我有一个带有嵌套表格的应用程序——一个表格可以查看课程列表,点击一个课程会转到一个新表格,显示参加的学生。

工作良好-即使在我添加了新课程和参加的学生之后,也能完美地显示数据。问题发生在我创建并保存此数据后的随机时间(秒而不是分钟)之后。这节课仍然会出现在第一张桌子上,但参加的学生会填空。

数据仍然存在,就像我停止然后启动模拟器一样——数据就在那里。

已经排除了在视图之间不能正确传递上下文的可能性。这个问题似乎发生在一些后台sql代码运行之后-如下所示:

2012-03-09 17:08:16.772 Club Manager[5147:12f1b] CoreData: sql: COMMIT
2012-03-09 17:08:16.774 Club Manager[5147:12f1b] CoreData: sql: BEGIN EXCLUSIVE
2012-03-09 17:08:16.775 Club Manager[5147:12f1b] CoreData: sql: UPDATE ZSTUDENT SET Z_OPT = ?  WHERE Z_PK = ? AND Z_OPT = ?
2012-03-09 17:08:16.776 Club Manager[5147:12f1b] CoreData: sql: UPDATE ZSTUDENT SET Z_OPT = ?  WHERE Z_PK = ? AND Z_OPT = ?
2012-03-09 17:08:16.777 Club Manager[5147:12f1b] CoreData: sql: INSERT INTO ZLESSON(Z_PK, Z_ENT, Z_OPT, ZDATE) VALUES(?, ?, ?, ?)
2012-03-09 17:08:16.786 Club Manager[5147:12f1b] CoreData: sql: INSERT OR REPLACE INTO Z_2STUDENTSATTENDED(Z_2LESSONSATTENDED, Z_4STUDENTSATTENDED) VALUES (11, 2)
2012-03-09 17:08:16.787 Club Manager[5147:12f1b] CoreData: sql: INSERT OR REPLACE INTO Z_2STUDENTSATTENDED(Z_2LESSONSATTENDED, Z_4STUDENTSATTENDED) VALUES (11, 1)
2012-03-09 17:08:16.788 Club Manager[5147:12f1b] CoreData: sql: COMMIT
2012-03-09 17:08:16.791 Club Manager[5147:12f1b] CoreData: sql: pragma page_count
2012-03-09 17:08:16.792 Club Manager[5147:12f1b] CoreData: annotation: sql execution time: 0.0014s
2012-03-09 17:08:16.793 Club Manager[5147:12f1b] CoreData: sql: pragma freelist_count
2012-03-09 17:08:16.795 Club Manager[5147:12f1b] CoreData: annotation: sql execution time: 0.0019s

这似乎让我为第二张表提取的行为有所不同——我使用了不同的设置来确保提取不会缓存对象,但似乎不会解决。。。。

- (void) setupFetchedResultsController
{
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Student"];
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"ddMMyyyy"];
    request.predicate = [NSPredicate predicateWithFormat:@"ANY lessonsAttended = [cd] %@", self.lesson];
    request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"lastName" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)]];
   [request setShouldRefreshRefetchedObjects:YES];
    [ request setReturnsObjectsAsFaults:NO];
   self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
                                                                    managedObjectContext:self.lesson.managedObjectContext
                                                                      sectionNameKeyPath:nil 
                                                                               cacheName:nil];
}

任何知道背景工作可能是什么以及为什么它会改变我的获取工作方式的人都会非常感激,因为这几天来一直让我抓狂。

第一次在这里问问题,请对我温和一点;)

John

设法解决了这个问题-我使用的谓词似乎有问题-通过更改:

request.predicate = [NSPredicate predicateWithFormat:@"ANY lessonsAttended = [cd] %@", self.lesson];

收件人:

request.predicate = [NSPredicate predicateWithFormat:@"ANY lessonsAttended.date = [cd] %@", self.lesson.date];

它开始工作了——我现在始终如一地获得正确的数据,而不是在我猜测的上下文/托管文档的自动保存之后发生变化。

如果有人能回答的话,我仍然会知道为什么会有不同。

REgards,

约翰。

最新更新