その後のその後

iOSエンジニア 堤 修一のブログ github.com/shu223

CoreData をちょっとだけ勉強

習得してしまえばCoreDataの方が開発効率がいい、という話をちらほら聞くので、テンプレートから生成されるソースを元にCoreDataってどういうことなのか、を勉強してみました。
30分やって何となくでもわかならいようならあきらめる、ということで。

テンプレート生成

Navigation BasedでUse Core Dataにチェック

xcdatamodeldファイルをみてみる

DB構造がXcodeでそのまま見れるってのはちょっと便利かも。

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return [[self.fetchedResultsController sections] count];
}
  • fetchedResultsControllerにはDBからフェッチしてきた結果が入っている
  • [self.fetchedResultsController sections] で NSArray 型の戻り値が得られるっぽい
  • 何がsectionになって何がrowになるのか、どこで指定してるのかはまだピンとこない
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section];
    return [sectionInfo numberOfObjects];
}

各要素には NSFetchedResultsSectionInfo に準拠したオブジェクトが入ってるらしい。

- (NSFetchedResultsController *)fetchedResultsController
{
    if (__fetchedResultsController != nil)
    {
        return __fetchedResultsController;
    }
    
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];
    
    [fetchRequest setFetchBatchSize:20];
    
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"timeStamp" ascending:NO];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
    
    [fetchRequest setSortDescriptors:sortDescriptors];
    
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"];
    aFetchedResultsController.delegate = self;
    self.fetchedResultsController = aFetchedResultsController;
    
    [aFetchedResultsController release];
    [fetchRequest release];
    [sortDescriptor release];
    [sortDescriptors release];

	NSError *error = nil;
	if (![self.fetchedResultsController performFetch:&error])
        {
	    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
	    abort();
	}
    
    return __fetchedResultsController;
}    

まだ30分経ってないけどここで何か心が折れました。レコードとってくる部分なんだろうけど、「おーこりゃ楽そう」って感じが全然しない。。


というわけでまたモチベーションが再燃したらやろうと思います。