シングルトン パターンの UIManagedDocument を使用した Core Dataに関する Justin Driscoll の記事を使用して、UITabViewController 用にセットアップしています。シミュレーターでアプリを実行しています。初めて正常に動作します。データベースが正常に作成され、各タブのテーブル ビュー コントローラーにデータが表示されます。しかし、アプリケーションを再起動すると、NSFetchRequest がエンティティに対して 0 件の一致をフェッチするため、テーブルビューは空になります。同じフェッチ リクエストは、最初の実行時に正しい結果をフェッチします。
シミュレーターでアプリを停止する前に、データをロードし、データを自動保存しないという非同期の性質に関係していると思います。そのため、アプリの 2 回目の実行ではデータを利用できません。
コードに見られるように、データの読み込みを行っている方法。fetchDataIntoDocument メソッドは、データの初期ロードを行います。
// ドキュメント ハンドラー シングルトン クラス
-(void) performWithDocument:(OnDocumentReady)onDocumentReady {
void (^OnDocumentDidLoad)(BOOL) = ^(BOOL Success) {
onDocumentReady(self.document);
};
if (![[NSFileManager defaultManager] fileExistsAtPath:[self.document.fileURL path]]) {
**[self fetchDataIntoDocument:self.document];**
[self.document saveToURL:self.document.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:OnDocumentDidLoad];
} else if (self.document.documentState == UIDocumentStateClosed) {
[self.document openWithCompletionHandler:OnDocumentDidLoad];
} else if (self.document.documentState == UIDocumentStateNormal) {
OnDocumentDidLoad(YES);
}
}
-(void)fetchDataIntoDocument:(UIManagedDocument *)document {
MyEntityDataController *dc= [[MyEntityDataController alloc] init];
NSDictionary *entityInfo =[dc getEntityInfo];
[document.managedObjectContext performBlock:^{
[Entity createEntityWithInfo:entityInfo inManagedObjectContext:document.managedObjectContext];
}];
}
私の TableViewController クラス
-(void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
if (!self.databaseDocument) {
[[LTDatabaseDocumentHandler sharedDatabaseDocumentHandler] performWithDocument:^ (UIManagedDocument *document) {
self.databaseDocument = document;
[self populateTableViewArrayFromDocument:self.databaseDocument];
}];
}
}
populateTableViewArrayFromDocument 内で、フェッチ要求を実行しています
-(void)populateTableViewArrayFromDocument:(UIManagedDocument *)document
{
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Entity2"];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[request setSortDescriptors:sortDescriptors];
NSError *error = nil;
NSArray *matches = [self.databaseDocument.managedObjectContext executeFetchRequest:request error:&error];
NSLog(@" matches count for Entity2 %d", matches.count);
for (Entity2 *entity2 in matches) {
//do stuff with data and add it to tableview array
}
}