从NSMutableArray中删除Core Data对象

时间:2012-10-24 15:42:10

标签: objective-c core-data nsmutablearray nsmanagedobject nsmanagedobjectcontext

我有一个NSMutableArray,它目前拥有一堆核心数据实体,如下所示:

NSFetchRequest *fetchReq = [[NSFetchRequest alloc]init];
[fetchReq setEntity:[NSEntityDescription entityForName:@"Subject"
                                inManagedObjectContext:self.managedObjectContext]];

subjectsArray = [self.managedObjectContext executeFetchRequest:fetchReq error:nil];
然后我把这个数组放在字典中:

_childrenDictionary = [NSMutableDictionary new];
[_childrenDictionary setObject:subjectsArray forKey:@"SUBJECTS"];

然后将此词典用作我已实现的源列表的数据。我遇到的问题是从subjectsArray中删除一个对象。我用以下代码尝试了这个:

_selectedSubject = [subjectsArray objectAtIndex:0];
[subjectsArray removeObject:subjectToDelete];

现在,当我执行以下操作时,此功能正常:

for (Subject *s in subjectsArray) {
        NSLog(@"Subjects: %@", [s title]);
    }

我选择删除的主题不再存在,而源列表我在调用后正确更新:

[_sidebarOutlineView reloadData];

我遇到的问题是,当我退出应用程序并再次打开它时,我之前删除的主题仍然存在。

将核心数据实体提取到数组和字典中是在 applicationDidFinishLaunching 中完成的。目前所有这些代码都在AppDelegate文件中,该文件的.h文件如下所示:

#import <Cocoa/Cocoa.h>
#import "Subject.h"

@interface LTAppDelegate : NSObject <NSApplicationDelegate, NSOutlineViewDelegate,     NSOutlineViewDataSource, NSMenuDelegate> {
    IBOutlet NSWindow *newSubjectSheet;
    IBOutlet NSWindow *newNoteSheet;
    IBOutlet NSWindow *newEditSheet;
    NSMutableArray *subjectsArray;
}

@property Subject *selectedSubject;
@property (assign)IBOutlet NSOutlineView *sidebarOutlineView;
@property NSArray *topLevelItems;
@property NSViewController *currentContentViewController;
@property NSMutableDictionary *childrenDictionary;
@property NSArray *allSubjects;

有关导致删除的内容的任何想法可能会重新出现吗?

2 个答案:

答案 0 :(得分:2)

您正在从本地数组中删除对象,但不删除CoreData存储本身。

要从Core Data商店中删除对象,您需要在其上调用managedObjectContext deleteObject:theObject,然后调用managedObjectContent save:&error来保留它。

如果您正在使用表视图,我建议您也查看NSFetchedResultsController。

答案 1 :(得分:1)

您需要将更改提交到NSManagedObjectContext才能保留。

查看该类的save:&errorOut方法以获取详细信息。