CoreDataの使い方メモ

[モデル]→取得→[Entity]
この流れを簡単にするのがCoreDataFrameworkです。


<h1>#import＜CoreData/CoreData.h＞</h1>
した上でEntityにするクラスを作っておく。ちなみに
こいつは、NSManagedObjectクラスを親として継承していなければ
ならない。


```objectivec:Entity.h
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>


@interface Entity : NSManagedObject

@property (nonatomic, retain) NSDate * deadline;
@property (nonatomic, retain) NSString * homeWork;
@property (nonatomic, retain) NSNumber * isExistAssign;
@property (nonatomic, retain) NSString * labelA;
@property (nonatomic, retain) NSString * labelB;
@property (nonatomic, retain) NSNumber * tag;

@end
```

一方

```objectivec:Entity.m
#import "Entity.h"
@implementation Entity
@dynamic deadline;
@dynamic homeWork;
@dynamic isExistAssign;
@dynamic labelA;
@dynamic labelB;
@dynamic tag;
@end

```

こんな感じ。[@dynamicてなんじゃってなったら](http://www.tokoro.me/2013/01/05/objc-dynamic/)


ことの運び方は
[モデル]→[エンティティ]
ラップしたエンティティを変更したりしなかったりしたあと、
Contextに突っ込んで実際のモデルに反映する。

ちなみに、とりあえずDB(Store)はsqliteを利用するので、作ってあげないとだめ。

```objectivec:ex
- (NSURL*)createStoreURL {
    NSArray *directories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *path = [[directories lastObject] stringByAppendingPathComponent:DB_NAME];
    NSURL *storeURL = [NSURL fileURLWithPath:path];
    return storeURL;
}
```
もちろんStore内につっこむモデルも

```objectivec:ex
- (NSURL*)createModelURL {
    NSBundle *mainBundle = [NSBundle mainBundle];
    NSString *path = [mainBundle pathForResource:MODEL_NAME ofType:@"momd"];
    NSURL *modelURL = [NSURL fileURLWithPath:path];
    return modelURL;
}
```

んで、NSManagedObjectModelと、ストアの実体NSPersistentScoreCoodinator,あとNSManagedObjectContextもつくる。

```objectivec:ex.m
- (NSManagedObjectContext*)createManagedObjectContext {
    NSURL *modelURL = [self createModelURL];
    NSURL *storeURL = [self createStoreURL];
    NSError *error = nil;
    NSManagedObjectModel *managedObjectModel=[[NSManagedObjectModel alloc]initWithContentsOfURL:modelURL];
    NSPersistentStoreCoordinator *persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:managedObjectModel];
    [persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error];
    NSManagedObjectContext *managedObjectContent = [[NSManagedObjectContext alloc] init];
    [managedObjectContent setPersistentStoreCoordinator:persistentStoreCoordinator];
    return managedObjectContent;
}

```

んで、Entityを新規に作成してコンテキストにつっこむのはこんなん。

```objectivec:ex

    Entity* newObject = [NSEntityDescription insertNewObjectForEntityForName:ENTITY_NAME inManagedObjectContext:context];

//newObjectに変化くわえーの
 
    NSError *error = nil;
    if([context save:&error]/*daoにflushするみたいな*/) {
       //セーブ成功した処理
    } else {
        //セーブに失敗したときの処理
    }


```

んじゃ逆にStoreから指定したオブジェクトを取得するには。

```objectivec:ex

 NSEntityDescription *entity = [NSEntityDescription entityForName:ENTITY_NAME inManagedObjectContext:context];
    
    NSFetchRequest *request = [[NSFetchRequest alloc]init];
    //取ってくるエンティティの設定を行う
    [request setEntity:entity];
    
    //検索条件の設定を行う。Add Predicate as filter;
    NSString *searchString = [searchWindows text];
    //比較対象を直接描くのがポイント
    NSPredicate *predicate =[NSPredicate predicateWithFormat:@"labelA == %@",searchString];
                              [request setPredicate:predicate];
    
    NSError *error = nil;
    
    //データのフェッチを行う Data Fetching.
    NSArray *fetchResults = [context executeFetchRequest:request error:&error];
    
    if([fetchResults count] > 0) {
        NSMutableString *str = [NSMutableString stringWithFormat:@"Found %d Datas \n",[fetchResults count]];
        int i = 0;
        for (Entity *ent in fetchResults) {
            [str appendFormat:@"Num:%d Room:%@ Name:%@ isAss:\n",i,ent.labelA,ent.labelB];
            i++;
        }
        
        dataViewer.text = str;
        
    } else {
        dataViewer.text = @"Data is None!";
    }
    

```
以上

[ここにCoreDataの簡単なSampleみたいなの置きました。多分使えます←](https://github.com/kawabatakazuki/CoreDataSampleApp)