0

我有一个 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"];

然后将该字典用作我已实现的源列表的数据。我遇到的问题是从subjectArray 中删除一个对象。我已经使用以下代码进行了尝试:

_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;

关于是什么导致删除的主题重新出现的任何想法?

4

2 回答 2

2

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

要从 Core Data 存储中删除一个对象,你需要调用managedObjectContext deleteObject:theObject它,然后调用managedObjectContent save:&error它来持久化它。

如果您使用的是表格视图,我建议您也检查一下 NSFetchedResultsController。

于 2012-10-24T15:49:50.413 回答
1

您需要将更改提交到NSManagedObjectContext以使其持久存在。

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

于 2012-10-24T15:45:48.463 回答