我有一个UItableView,我正在显示一个项目列表。您可以选择和取消选择此项目列表。
当用户从tableview中选择一个项目时,我将该字典添加到我的coredata
当用户从tableview中取消选择一个项目时,我会从我的coredata中删除该字典。
在这方面每件事都运作正常,因为我在每次选择时记录coredata对象并取消选择所以我可以看到如果我选择了它们则有1 2或3个项目然后如果我取消选择说第3项它只记录1和2。
所以我知道这些功能正常。现在我已经实现了下一件事,那就是错误的是当桌面视图显示时,我检查我的coredata中是否有任何项目,然后当我找到与当前单元格相关的项目时,我添加了一个附件标记。这是为了显示您已经将哪些值保存到核心数据中。
现在奇怪的是,以前我从coredata中移除了第3项并通过阅读coredata值并仅看到1& 2存在。然后重建应用程序以检查并确保该功能正常工作,在视图加载时分配滴答。一旦视图加载项目1 2和3全部再次被选中.....即使3不应该。
我不确定我做错了什么,但这是我的取消选择的coredata删除功能
// Deleting values/tables from coredata entity
- (void)deleteSingleObject:(NSString *)entityDescription Dictionary:(NSDictionary *)dictionary {
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:entityDescription inManagedObjectContext:__managedObjectContext];
[fetchRequest setEntity:entity];
NSString *projectIDString = [dictionary objectForKey:@"ProjectID"];
NSPredicate *p=[NSPredicate predicateWithFormat:@"projectID == %@",projectIDString];
[fetchRequest setPredicate:p];
NSError *error;
NSArray *items = [__managedObjectContext executeFetchRequest:fetchRequest error:&error];
for (NSManagedObject *product in items) {
[__managedObjectContext deleteObject:product];
}
}
这就是我在视图加载时分配刻度的方法
// check if cell needs accessorytick
for (int i = 0; i < [projectListReadFromCoreDataMutableArray count]; i++) {
NSDictionary *tempReadCoreDataDictionary = [projectListReadFromCoreDataMutableArray objectAtIndex:i];
if ([[tempReadCoreDataDictionary objectForKey:@"ProjectID"] isEqualToString:[projectDictionary objectForKey:@"ProjectID"]]) {
projectListCustomCell.accessoryType = UITableViewCellAccessoryCheckmark;
}
}
任何帮助将不胜感激。 如果你需要更多的信息或代码让我知道,但这些是我认为这是不起作用的两个核心部分。
答案 0 :(得分:4)
您正在从托管对象上下文中删除该对象,但您永远不会将此类修改保存到持久性存储中。
正如在保存上下文之前未将新对象保存到商店一样,在保存上下文之前,不会从商店中删除已删除的对象
这就是为什么当您重新加载应用程序时对象再次出现的原因。
您必须将MOC保存到持久性存储中以使删除成为永久性,例如
NSError *error = nil;
if (![_managedObjectContext save:&error]) {
// handle error
}