シンプルな UIManagedDocument ベースの Core Data アプリがあります。私はiOSでプログラミングするのが初めてで、ほとんど着手できず、立ち往生しています。Core Data に格納されている People NSManagedObjects があります。アプリを最初に起動したとき、エントリはありませんが、モーダル VC を上にスライドして閉じると、魔法のように表示されます。私のデザインは、iTunes U/Sanford コースの「Photomania」アプリに大まかに基づいていますが、managedObjectContext の取得を処理するシングルトン CoreDataStore オブジェクトを使用しています。これは私の CoreDataStore のコードです:
+ (CoreDataStore *)sharedStore
{
static CoreDataStore *sharedStore = nil;
if (!sharedStore)
sharedStore = [[super allocWithZone:nil] init];
return sharedStore;
}
+ (instancetype)allocWithZone:(struct _NSZone *)zone
{
return [self sharedStore];
}
- (NSManagedObjectContext *)getContext
{
NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory
inDomains:NSUserDomainMask] lastObject];
url = [url URLByAppendingPathComponent:@"dbDocument"];
UIManagedDocument *document = [[UIManagedDocument alloc] initWithFileURL:url];
if (![[NSFileManager defaultManager] fileExistsAtPath:[url path]]) {
NSLog(@"No file exists...");
[document saveToURL:url forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
NSLog(@"Document saveForCreating completionHandler invoked. Success: %hhd", success);
if (success) {
self.managedObjectContext = document.managedObjectContext;
NSLog(@"Got context for created file!!");
}
}];
} else if (document.documentState == UIDocumentStateClosed) {
NSLog(@"Document state is closed. documentState == %u", document.documentState);
[document openWithCompletionHandler:^(BOOL success) {
NSLog(@"Document opening success: %hhd", success);
if (success) {
self.managedObjectContext = document.managedObjectContext;
NSLog(@"Got context for now-opened file!!");
}
}];
} else {
self.managedObjectContext = document.managedObjectContext;
NSLog(@"Got context for already-opened file!!");
}
return self.managedObjectContext;
}
PeopleListViewController のコードは次のとおりです。
- (void)setManagedObjectContext:(NSManagedObjectContext *)managedObjectContext
{
_managedObjectContext = managedObjectContext;
if (managedObjectContext) {
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Person"];
request.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"name"
ascending:YES
selector:@selector(localizedCaseInsensitiveCompare:)]];
request.predicate = nil; // all Persons
self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:nil];
} else {
self.fetchedResultsController = nil;
}
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
if (!self.managedObjectContext)
[self setManagedObjectContext:[[CoreDataStore sharedStore] getContext]];
}
これは、起動直後の結果です。
これはモーダル VC です。
これは、モーダル VC を閉じた後です ([キャンセル] をタップ):
私は managedObjectContext で performFetch を使用しようとしましたが、Core Data ドキュメントが開かれたと報告された後もそれを遅らせました。何も機能しません。どんな助けでも大歓迎です。