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

时间:2012-03-09 17:30:00

标签: objective-c ios core-data

我对核心数据有一个奇怪的问题。我有一个带嵌套表的应用程序 - 一个表查看课程列表,单击课程segues到一个新表,显示出席的学生。

工作正常 - 即使在我添加新课程和参加的学生之后,也能完美地显示数据。在创建并保存此数据后,在经过一段随机时间(秒而不是几分钟)后出现问题。该课程仍将显示在第一个表格中,但是出席空白的学生将会出现。

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

已排除不在视图之间正确传递上下文。一些后台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

这似乎使我对第二个表的获取行为有所不同 - 使用不同的设置来确保fetch不会缓存对象但似乎无法解决....

- (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];

}

任何人都知道后台工作可能是什么,以及为什么它会改变我的获取工作的方式会非常感激,因为这让我疯了好几天。

第一次在这里问一个问题,请对我温柔;)

约翰

1 个答案:

答案 0 :(得分:0)

管理来解决这个问题 - 我使用的谓词似乎存在问题 - 通过更改:

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

要:

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

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

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

的问候,

约翰。