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

この辞書は、私が実装したソースリストのデータとして使用されます。私が問題を抱えているのは、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;

削除されたサブジェクトが再表示される原因について何か考えはありますか?

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 に答える