æ¬æ¥ããã€ã±ã«ã»ããªããŒããšãããŒãã»ã¯ãŒããŒã®æ¬ãiOSçšã®ããã³ã¢ããŒã¿ãã«é¢ããå®è·µçãªæŒç¿ã§äžé£ã®è¬çŸ©ãæžãå§ããããšæããŸãã åç« ã«ã¯ãçè«çããã³å®çšçãªéšåãå«ãŸããŸãã
å 容ïŒ
- ç« çªå·1ã ã¯ããã« ïŒ å®çšçãªéšå ïŒ
- ç« çªå·2ã ãã¹ã¿ãŒã³ã¢ããŒã¿
- ç« çªå·3ã ããŒã¿ã¹ãã¬ãŒãžïŒSQLiteããã³ãã®ä»ã®ãªãã·ã§ã³
- ç« çªå·4ã ããŒã¿ã¢ãã«ã®äœæ
- 第5ç« ã ããŒã¿ãªããžã§ã¯ãã®æäœ
- 第6ç« çµæã»ããã®åŠç
- ç« çªå·7ã ããã©ãŒãã³ã¹ãšã¡ã¢ãªã®ãã¥ãŒãã³ã°
- 第8ç« ã ããŒãžã§ã³ç®¡çãšç§»è¡
- ç« çªå·9ã NSFetchedResultsControllerã䜿çšããŠããŒãã«ã管çãã
- ç« çªå·10ã é«åºŠãªã¢ããªã±ãŒã·ã§ã³ã§ã³ã¢ããŒã¿ã䜿çšãã
éãã
ã³ã¢ããŒã¿ãšã¯
ã³ã³ãã¥ãŒã¿ãŒã䜿çšããŠã¿ã¹ã¯ãå®è¡ãããšãå€æŽãä¿åãããããšãæåŸ ãããŸãã å€æŽã®ä¿åã¯ããªãã£ã¹ãœãããŠã§ã¢ããã±ãŒãžãããã¹ããšãã£ã¿ãŒãã²ãŒã ããã©ãŠã¶ãŒãªã©ã§éèŠãªåœ¹å²ãæãããŸãã ã»ãšãã©ã®ãœãããŠã§ã¢ã«ã¯ãäœæ¥ç¶æ ãåŸã§åŸ©å ããããã«ãŠãŒã¶ãŒãå ¥åããããŒã¿ãä¿åããæ©èœãå¿ èŠã§ããããã¡ããããããå¿ èŠãšããªããœãããŠã§ã¢ããããŸã-é»åããã¥ãŒã¹ãã£ãŒããã¢ã©ãŒã ã倩æ°ãŠã£ãžã§ããã
é«åºŠãªã¢ããªã±ãŒã·ã§ã³ãéçºãããšãã¯ãiDeviceã«ããŒã¿ãä¿åããæ¹æ³ãç解ããããšãéèŠã§ãã
Appleã¯ãããã€ã¹ã«ä¿åãããŠããããŒã¿ãæ±ãããã®æè»ãªãã¬ãŒã ã¯ãŒã¯ãCore DataãæäŸããŠããŸãã ãã¡ãããCore Dataã¯äžèœè¬ã§ã¯ãªããç¹å®ã®ã¿ã¹ã¯ã«ããé©ããããŒã¿ãä¿åããããã®ãªãã·ã§ã³ã¯ä»ã«ããããŸãããCore Dataã¯Cocoa Touchã«éåžžã«ãããã£ããããŸãã Core Dataã¯ãããŒã¿ãŠã§ã¢ããŠã¹ã§ã®äœæ¥ã«é¢ãã詳现ã®ã»ãšãã©ãé ããã¢ããªã±ãŒã·ã§ã³ãæ¬åœã«æ¥œãããŠããŒã¯ã§äœ¿ãããããã®ã«ããããšã«éäžã§ããŸãã
Core Dataã¯SQLiteã®ãããªãªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ã«ããŒã¿ãä¿åã§ãããšããäºå®ã«ãããããããCore Dataã¯DBMSã§ã¯ãããŸããã å®éãCore Dataã¯ãªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ãã¹ãã¬ãŒãžãšããŠãŸã£ãã䜿çšããªãå ŽåããããŸãã Core Dataã¯Hibernateã®ãããªãã®ã§ã¯ãããŸããããããã€ãã®ORMæ©èœãæäŸããŸãã ã³ã¢ããŒã¿ã¯ãéåžžã®ãªããžã§ã¯ãæåããã°ã©ãã³ã°ã§ãªããžã§ã¯ãã°ã©ããæäœããã®ã«äŒŒã圢åŒã§ããšã³ãã£ãã£ãšãã®é¢ä¿ïŒä»ã®ãªããžã§ã¯ããšã®é¢ä¿ïŒãå±æ§ãæäœã§ããããŒã¿ã©ãããŒ/ãã¬ãŒã ã¯ãŒã¯ã§ããå¯èœæ§ããããŸãã
ç¥ã£ãŠãïŒ
ã³ã¢ããŒã¿ã¯ãMac OS X 10.4 Tigerããã³iPhone SDK 3.0以éã«ã®ã¿å°å ¥ãããŸãã
IOSã¹ãã¬ãŒãžå±¥æŽ
ãã¯ãµãŒããªãªãŒã¹ããã¢ãã¡ãŒã·ã§ã³æ ç»ã«ã€ããŠNeXTã«æè¬ãã¹ãã§ããããã«ãCore Dataã«ãæè¬ãã¹ãã§ãã ã³ã¢ããŒã¿ã¯ãEnterprise Objects FrameworkïŒEOFïŒãšåŒã°ãããã¯ãããžãŒããçãŸããé²åããŸããã
ãã¬ãŒã ã¯ãŒã¯ã®ããã¥ãŒã¯2005幎ã«Mac OS X 10.4ïŒTigerïŒã®çºå£²ãšãšãã«è¡ãããŸãããiPhoneã¯ããŒãžã§ã³3.0以éã§ã®ã¿è¡šç€ºãããŸãã
Core DataãiPhoneã«å±ãåã¯ãéçºè ã¯èŠåŽãã次ã®ãªãã·ã§ã³ã䜿çšããŠããŒã¿ãä¿åã§ããŸããã
1ïŒããŸããŸãªããŒã¿åã®ããŒãšå€ã®ãã¢ãå«ãããããã£ã®ãªã¹ãã
2ïŒããŒã¿ã®ã·ãªã¢ã«åãšãã¡ã€ã«ãžã®ä¿åïŒNSCodingãããã³ã«ã䜿çšãããïŒ
3ïŒSQLiteãªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹
4ïŒã¯ã©ãŠãå ã®ããŒã¿ã¹ãã¬ãŒãž
ãããã®æ¹æ³ã¯çŸåšã䜿çšãããŠããŸãããCore Dataã䜿çšããŠå©äŸ¿æ§ã®èŠ³ç¹ããæ¯èŒã§ãã4ã€ã®æ¹æ³ã®1ã€ã¯ãããŸããã FMDatabaseãActiveRecordãªã©ã®ãã¬ãŒã ã¯ãŒã¯ã®èªçã«ãããããããCore Dataã®ç»å Žåã®ããŒã¿ã¹ãã¬ãŒãžã®åé¡ã解決ãããããéçºè ã¯åãã§Core Dataã«åãæ¿ããŸããã
Core Dataã¯ãã¹ãŠã®ç æ°ã®æ²»çæ³ã§ã¯ãªãããšãç¹°ãè¿ããŸããããã¡ãããããšãã°ããããã£ã®ãªã¹ãã䜿çšããŠãœãªã¥ãŒã·ã§ã³ãåç §ããããšããããŸãããã»ãšãã©ã®å Žåãã¢ããªã±ãŒã·ã§ã³ã§Core Dataãããªãã®åé¡ã解決ããæè¯ã®æ¹æ³ã
Core Dataãããé »ç¹ã«ããã°ã©ãã³ã°ããŠäœ¿çšããã»ã©ããCore Dataã䜿çšããå¿ èŠããããŸããïŒããšãã質åã¯é »ç¹ã«ãªããªããŸããããCore Dataã䜿çšããªãçç±ã¯ãããŸããïŒã
Core Dataã䜿çšããã·ã³ãã«ãªã¢ããªã±ãŒã·ã§ã³ã®äœæ
ãã®ã»ã¯ã·ã§ã³ã§ã¯ãXcodeãã³ãã¬ãŒãã®1ã€ããã³ã¢ããŒã¿ã«åºã¥ããŠç°¡åãªã¢ããªã±ãŒã·ã§ã³ãäœæãããã®äž»èŠéšåãåæããŸãã ãã®ããŒãã®æåŸã§ã¯ãã¢ããªã±ãŒã·ã§ã³ãã©ã®ããã«Core DataãšããåãããŠããŒã¿ãä¿åããã³ååŸããããç解ããŸãã
ã³ã¢ããŒã¿ã³ã¢ã³ã³ããŒãã³ãã«ã€ããŠ
ã³ãŒãã«é£ã³èŸŒãã§ãã¹ãã¢ããªã±ãŒã·ã§ã³ã解æããåã«ãCore Dataã®ã³ã³ããŒãã³ãã«ã€ããŠç解ããå¿ èŠããããŸãã 次ã®å³ã¯ããã¹ãã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšããäž»ãªèŠçŽ ã瀺ããŠããŸãã
ã³ã¢ããŒã¿ãŠãŒã¶ãŒãšããŠãããŒã¿ãŠã§ã¢ããŠã¹ãçŽæ¥æäœããªãã§ãã ããã ã¹ãã¬ãŒãžããé¢ããŠãã¹ãã¬ãŒãžã®çš®é¡ãããããŒã¿ã®ã¿ãèããŠãã ããïŒ ãã®ã¢ãããŒãã®ç¹åŸŽã¯ã倧éã®ã³ãŒããå€æŽããã«ã¹ãã¬ãŒãžã®ã¿ã€ããç°¡åã«å€æŽã§ããããšã§ãïŒXMLãã¡ã€ã«ããããŸããããSQLiteã«ãªããŸããïŒã
ãã¬ãŒã ã¯ãŒã¯ã«ãã£ãŠç®¡çããããªããžã§ã¯ãïŒã³ã¢ããŒã¿ïŒã¯ãNSManagedObjectã¯ã©ã¹ã®ã¡ãœãã/ããããã£ãç¶æ¿ããå¿ èŠããããŸãã
人ã ãšåãããã«ããªããžã§ã¯ãã«ã¯ãªããžã§ã¯ããååšã§ããç°å¢ãå¿ èŠã§ãããã®ãããªç°å¢ã¯ç®¡çãªããžã§ã¯ãã³ã³ããã¹ãïŒç®¡çãªããžã§ã¯ãã®ã³ã³ããã¹ãïŒãŸãã¯åã«ã³ã³ããã¹ããšåŒã°ããŸãã ãªããžã§ã¯ãã眮ãããŠããç°å¢ã¯ãäœæ¥äžã®ãªããžã§ã¯ãã®ç¶æ ã ãã§ãªããé¢é£ãããªããžã§ã¯ãïŒããã«äŸåããäŸåããŠãããªããžã§ã¯ãïŒã®ç¶æ ãç£èŠããŸãã
NSManagedObjectContextã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã¯ããªããžã§ã¯ãã«å¯ŸããŠåãç°å¢ãæäŸããŸãããã®ã¿ã€ãã®ãªããžã§ã¯ãã¯ãã¢ããªã±ãŒã·ã§ã³ã§åžžã«å©çšå¯èœã§ããå¿ èŠããããŸãã éåžžãNSManagedObjectContextã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ããªã²ãŒãããããã£ã§ãã ç°å¢ããªããNSManagedObjectContextã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ããªããšãã³ã¢ããŒã¿ãæäœã§ããŸããã
æ°ãããããžã§ã¯ããäœæãã
Xcodeãèµ·åãããã¹ã¿ãŒ/ãã£ããŒã«ã¢ããªã±ãŒã·ã§ã³ãã³ãã¬ãŒãããæ°ãããããžã§ã¯ããäœæããŸãã
次ã®ããã«ãã£ãŒã«ãã«å ¥åããŸãã
äœæãå®äºãããšã次ã®ãããªãã®ã衚瀺ãããŸãã
ãããžã§ã¯ããç«ã¡äžããŸã
ãã®ã¢ããªã±ãŒã·ã§ã³ã®å éšã«ãããã®ãç解ããåã«ãã¢ããªã±ãŒã·ã§ã³ãäžè¬çã«äœãããã®ããå§ããŸãããã
ãå®è¡ããã¿ã³ãã¯ãªãã¯ãããšããããç®ã®åã«è¡šç€ºãããŸãã
ã+ãã®ä»ãããã¿ã³ãæ°åæŒããšãæéã®çµéãšãšãã«ãªã¹ãã«ããã€ãã®ãšã³ããªã衚瀺ãããŸãã
ããã§ãã¢ããªã±ãŒã·ã§ã³ãçµäºïŒåæ¢ïŒããã¢ããªã±ãŒã·ã§ã³ãããŒã¿ã®ä¿åã«ã³ã¢ããŒã¿ã䜿çšããªãå Žåã次ã®éå§æã«ç©ºã®ãªã¹ããåã³è¡šç€ºãããŸãããåèµ·ååŸãåãç»åã衚瀺ãããŸãã
ã¢ããªã±ãŒã·ã§ã³ã®ã³ã³ããŒãã³ããåæããŸã
ã¢ããªã±ãŒã·ã§ã³ã®æ§é ã¯æ¯èŒçåçŽã§ãã ããŒã¿ããŒã¹ïŒã¹ãã¬ãŒãžïŒã«æ ŒçŽãããŠãããšã³ãã£ãã£ãèšè¿°ããããŒã¿ã¢ãã«ãååšããå Žåã ç»é¢ïŒããŒãã«ïŒãšããŒã¿ãŠã§ã¢ããŠã¹éã®çžäºäœçšãä¿é²ããã³ã³ãããŒã©ãŒã ã¢ããªã±ãŒã·ã§ã³ã®åæåãšå®è¡ãæ¯æŽããã¢ããªã±ãŒã·ã§ã³ããªã²ãŒãã
以äžã®ç»åã¯ãã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšãããã¯ã©ã¹ãšãããã®çžäºé¢ä¿ã瀺ããŠããŸãã
MasterViewControllerã¯ã©ã¹ã«ã¯ãNSManagedObjectContextã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãåç §ããŠã³ã¢ããŒã¿ãšããåãããããããã£ãå«ãŸããŠããããšã«æ³šæããŠãã ããã ã³ãŒãã確èªãããšãMasterViewControllerãã¢ããªã±ãŒã·ã§ã³ã®ããªã²ãŒãããããã£ãã管ç察象ãªããžã§ã¯ãã³ã³ããã¹ããååŸããŠããããšãããããŸãã
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if(self){ self.title = NSLocalizedString(@"Master", @"Master"); id delegate = [[UIApplication sharedApplication] delegate]; self.managedObjectContext = [delegate managedObjectContext]; } return self; }
BasicApplication.xcdatamodelã¯ãããŒã¿ã¢ãã«ã®æ§é ã«é¢ããæ å ±ãå«ããã¡ã€ã«ã·ã¹ãã å ã®ãã£ã¬ã¯ããªã§ãã ããŒã¿ã¢ãã«ã¯ãã³ã¢ããŒã¿ã䜿çšãããã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ã®åºç€ã§ãã
ãã®ã¢ããªã±ãŒã·ã§ã³ã®ããŒã¿ã¢ãã«ã¯ã1ã€ã®ãšã³ãã£ãã£-ã€ãã³ãã®ã¿ãèšè¿°ããŸãã ã€ãã³ããšã³ãã£ãã£ã«ã¯ã1ã€ã®ããããã£ïŒãã£ãŒã«ããå±æ§ïŒã®ã¿ãå«ãŸããŸã-ã¿ã€ãDateã®timeStampã
NSManagedObjectã¿ã€ãã®ã€ãã³ããšã³ãã£ãã£ãã³ã¢ããŒã¿ã®å¶åŸ¡äžã«ãããã¹ãŠã®ãšã³ãã£ãã£ã®ã¡ã€ã³ãšã³ãã£ãã£ãšèŠãªãããŸãã 2çªç®ã®ç« ã§ã¯ãNSManagedObjectåãããã«è©³ããèŠãŠãããŸãã
ããŒã¿ã®ååŸ/ååŸ
次ã«èå³ã®ããã¯ã©ã¹ã¯MasterViewControllerã§ãã ãã®ããããŒãã¡ã€ã«ã«ã¯ã泚æãã2ã€ã®ããããã£ãèšè¿°ãããŠããŸãã
@property (nonatomic, strong) NSFetchedResultsController *fetchedResultsController; @property (nonatomic, strong) NSManagedObjectContext *managedObjectContext;
NSFetchedResultsControllerã¯ãã¹ãã¬ãŒãžèŠæ±ã管çããããã«Core Dataãã¬ãŒã ã¯ãŒã¯ã«ãã£ãŠæäŸãããã³ã³ãããŒã©ãŒã§ãã
NSManagedObjectContextã¯ãNSManagedObjectåã®ãªããžã§ã¯ããååšããç°å¢ãšããŠãã§ã«ç¥ãããŠããŸãã
MasterViewController.mãã¡ã€ã«ã«ããMasterViewControllerã¯ã©ã¹ã®å®è£ ã¯ãããŒã¿ãååŸããã³ä¿åããããã«Core Dataãšå¯Ÿè©±ããæ¹æ³ã瀺ããŠããŸãã MasterVIewControllerã¯ã©ã¹ã®å®è£ ã«ã¯ãã¹ãã¬ãŒãžããããŒã¿ãéžæããèŠæ±ãäºåèšå®ããæ瀺çãªã²ãã¿ãŒfetchedResultsControllerããããŸãã
ããŒã¿ãµã³ããªã³ã°ã®ã¯ãšãªãäœæããæåã®æé ã¯ãã¯ãšãªãäœæããããšã§ãã
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:self.managedObjectContext]; [fetchRequest setEntity:entity];
ã¯ãšãªçµæã¯ãNSSortDescriptorã䜿çšããŠãœãŒãã§ããŸãã NSSortDescriptorã¯ããœãŒããã£ãŒã«ããšãœãŒãã¿ã€ãïŒæé ãŸãã¯éé ïŒãå®çŸ©ããŸãã
ãã®äŸã§ã¯ãã¬ã³ãŒãã®äœææéãéé ã«äžŠã¹æ¿ããŸãã
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"timeStamp" ascending:NO]; NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; [fetchRequest setSortDescriptors:sortDescriptors];
ãªã¯ãšã¹ããå®çŸ©ãããããNSFetchedResultsControllerã®äœæã«é²ãããšãã§ããŸãã
NSFetchedResultsController MasterVIewControllerãããªã²ãŒããšããŠäœ¿çšããŠãã¹ãã¬ãŒãžããŒã¿ã®ç¶æ ïŒåé€ãè¿œå ã移åãªã©ïŒãç£èŠãããã®ãœãªã¥ãŒã·ã§ã³ãUITableViewãšã·ãŒã ã¬ã¹ã«çµ±åã§ããŸãã ãã¡ããã管çãªããžã§ã¯ãã³ã³ããã¹ãã§executeFetchRequestã¡ãœãããåŒã³åºãããšã§åãçµæãååŸã§ããŸããããã®å ŽåãNSFetchedResultsControllerãåä¿¡ãããååã«æŽ»çšã§ããŸããã
NSFetchedResultsControllerã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹å€æ°ãäœæããŠæ§æããŸãã
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"Master"]; aFetchedResultsController.delegate = self; self.fetchedResultsController = aFetchedResultsController;
ç¥ã£ãŠãïŒ
ããããã以åã«äœ¿çšããinitWithFetchRequestã¡ãœããã«cacheNameãã©ã¡ãŒã¿ãŒãããããšã«æ°ã¥ããã§ãããã åŒæ°ãšããŠnilãæž¡ããšããªã¯ãšã¹ãã®çµæããã£ãã·ã¥ããå¯èœæ§ãé€å€ããŸããããã£ãã·ã¥ã®ååãæå®ãããšãCore Dataã以åã«å®è¡ãããåããªã¯ãšã¹ãã®ååšããã§ãã¯ãããã£ãã·ã¥ããçµæãè¿ãããšãã§ããŸãã ãã以å€ã®å Žåããã®ãã£ãã·ã¥åã®ãªã¯ãšã¹ãããªãå Žåãã¹ãã¬ãŒãžã«å¯ŸããŠãªã¯ãšã¹ããè¡ãããå¿ èŠãªããŒã¿ãè¿ãããåŸã§ãã£ãã·ã¥ãããŸãã
çµè«ãšããŠãç§ãã¡ã«æ®ãããŠããã®ã¯ãããŒã¿ãååŸããèŠæ±ãæºããããšã ãã§ãã
NSError *error = nil; if(![self.fetchedResultsController performFetch:&error]){ NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); }
以äžã«ãå®å šãªfetchedResultsControllerã²ãã¿ãŒããããŸãã
- (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:@"Master"]; aFetchedResultsController.delegate = self; self.fetchedResultsController = aFetchedResultsController; NSError *error = nil; if(![self.fetchedResultsController performFetch:&error]){ NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); } return __fetchedResultsController; }
NSFetchedResultsControllerã¯NSManagedObjectåã®ãªããžã§ã¯ãã®ã³ã¬ã¯ã·ã§ã³ã®ãããªãã®ã§ãããã®ãããã¯ãšãªçµæã«ã¢ã¯ã»ã¹ããããã«NSArrayåã®fetchedObjectsããããã£ããæã£ãŠããŸãã
UITableViewControllerã®æ©èœãæ¡åŒµããMasterVIewControllerã¯ã©ã¹ã¯ãNSFetchedResultsControllerã䜿çšããŠããŒãã«ã®ã³ã³ãã³ãã管çããããšãããã«äŸ¿å©ãã瀺ããŠããŸãã
æ°ãããªããžã§ã¯ããæ¿å ¥ãã
insertNewObjectïŒã¡ãœãããäžèŠãããšãæ°ããã€ãã³ããã©ã®ããã«äœæããããªããžããªã«è¿œå ãããããæ確ã«ãªããŸãã NSManagedObjectsã¯ãããŒã¿ã¢ãã«ã®ãšã³ãã£ãã£èšè¿°ã«ãã£ãŠå®çŸ©ãããç¹å®ã®ã³ã³ããã¹ãïŒç°å¢ïŒã«ã®ã¿ååšã§ããŸãã æ°ãããªããžã§ã¯ããäœæããæåã®ã¹ãããã¯ããã®ãªããžã§ã¯ããäœæãããã³ã³ããã¹ããååŸããããšã§ãã
NSManagedObjectContext *managedObjectContext = [self.fetchedResultsController managedObjectContext]; NSEntityDescription *entity = [[self.fetchedResultsController fetchRequest] entity];
NSManagedObjectãäœæããŸãã
NSManagedObject *newManagedObject = [NSEntityDescription insertNewObjectForEntity:[entity name] inManagedObjectContext:context]; [newManagedObject setValue:[NSDate date] forKey:@"timeStamp"];
å®è¡ããå¿ èŠãããæåŸã®æé ã¯ãæ°ãããªããžã§ã¯ããäœæãããã³ã³ããã¹ããä¿åããããšã§ãã ã³ã³ããã¹ããä¿åãããšã以åã«ä¿åãããªãã£ããã¹ãŠã®å€æŽãä¿åãããããšã«æ³šæããŠãã ããã
NSError *error = nil; if(![context save:&error]){ NSLog(@"Unresolved error: %@, %@", error, [error userInfo]); abort(); }
æ°ãããªããžã§ã¯ããè¿œå ããå®å šãªæ¹æ³ã以äžã«ç€ºããŸãã
- (void)insertNewObject { NSManagedObjectContext *managedObjectContext = [self.fetchedResultsController managedObjectContext]; NSEntityDescription *entity = [[self.fetchedResultsController fetchRequest] entity]; NSManagedObject *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context]; [newManagedObject setValue:[NSDate date] forKey:@"timeStamp"]; NSError *error = nil; if(![context save:&error]){ NSLog(@"Unresolved error: %@, %@", error, [error userInfo]); abort(); } }
ã³ã³ããã¹ãã®åæåïŒç°å¢ïŒ
æããã«ãã³ã³ããã¹ããªããžã§ã¯ããäœæããã«ããªããžã§ã¯ããååšãç掻ããç°å¢ããªããã°ã以åã«è¡ã£ãããšãã¹ãŠãéæããããšã¯ã§ããŸããã ã¢ããªã±ãŒã·ã§ã³ããªã²ãŒãã¯ããŸãã«ãã®ç°å¢ãäœæãã責任ããããŸãã ã³ã¢ããŒã¿ã䜿çšããã¢ããªã±ãŒã·ã§ã³ã§å¿ èŠãª3ã€ã®ããããã£ïŒ
@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext; @property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel; @property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
3ã€ã®ããããã£ã¯ãã¹ãŠèªã¿åãå°çšã§ããããšã«æ³šæããŠãã ãããããã¯ãå€éšããèšå®ã§ããªãããã«ããããã§ãã BasicApplicationAppDelegate.mã調ã¹ããšã3ã€ã®ããããã£ãã¹ãŠã«æ瀺çãªã²ãã¿ãŒãããããšãããããŸãã
管çãªããžã§ã¯ãã¢ãã«ïŒ
- (NSManagedObjectModel *)managedObjectModel { if(_managedObjectModel != nil){ return _managedObjectModel; } NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"BasicApplication" withExtension:@"momd"]; _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modeURL]; return _managedObjectModel; }
ãã®åŸãäœæãããããŒã¿ã¢ãã«ããµããŒãããã¹ãã¬ãŒãžãäœæãããŸãã å®éãã³ã¢ããŒã¿ã䜿çšããä»ã®ã»ãšãã©ã®å Žåãšåæ§ã«ãããŒã¿ãŠã§ã¢ããŠã¹ã¯SQLiteã«åºã¥ããŠããŸãã
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { if(_persistentStoreCoordinator != nil){ return _persistentStoreCoordinator; } NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"BasicApplication.sqlite"]; NSError* error = nil; _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; if(![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]){ NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); } return _persistentStoreCoordinator; }
ã³ã³ããã¹ãïŒç°å¢ïŒãäœæããŸãã
- (NSManagedObjectContext *)managedObjectContext { if(_managedObjectContext != nil){ return _managedObjectContext; } NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; if(coordinator != nil){ _managedObjectContext = [[NSManagedObjectContext alloc] init]; [_managedObjectContext setPersistentStoreCoordinator:coordinator]; } return _managedObjectContext; }
ã³ã³ããã¹ãã¯ãã³ã¢ããŒã¿ããã³æ°žç¶ã¹ãã¬ãŒãžãšå¯Ÿè©±ããããã®ã€ã³ã¿ãŒãã§ã€ã¹ãšããŠã¢ããªã±ãŒã·ã§ã³å šäœã§äœ¿çšãããŸãã
ã³ã¢ããŒã¿ã®åæåã·ãŒã±ã³ã¹ïŒ
ã¡ã«ããºã ã¯ãapplicationïŒdidFinishLaunchingWithOptionsã¡ãœãããåŒã³åºããããšãã«éå§ãããŸãã
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; MasterViewController *controller = [[MasterViewController alloc] initWithNibName:@"MasterViewController" bundle:nil]; self.navigationController = [[UINavigationController alloc] initWithRootViewController:controller]; self.window.rootViewController = self.navigationController; [self.window makeKeyAndVisible]; return YES; }
å®è¡ã®ããã«ã¢ããªã±ãŒã·ã§ã³ããªã²ãŒãã®managedObjectContextããããã£ã®getterãåŒã³åºããšãäžé£ã®ã¢ã¯ã·ã§ã³ãèµ·åããŸãã
-ïŒNSManagedObjectContext *ïŒmanagedObjectContextã®åŒã³åºã
-ïŒNSPersistentStoreCoordinator *ïŒpersistentStoreCoordinatorãããã¯é çªã«åŒã³åºããè¡ããŸã
-ïŒNSManagedObjectModel *ïŒmanagedObjectModelã
ãããã£ãŠãmanagedObjectContextã®getterã¡ãœãããåŒã³åºããšãCore Dataãªããžã§ã¯ãã®ã¹ã¿ãã¯å šäœãåæåãããCore Dataã«ã¢ã©ãŒããéä¿¡ãããŸãã
æ¢åã®ãããžã§ã¯ãã«ã³ã¢ããŒã¿ãè¿œå ãã
次ã®3ã€ã®ã¹ãããã§å®è¡ãããŸãã
- ã³ã¢ããŒã¿ãã¬ãŒã ã¯ãŒã¯ã®è¿œå
- ããŒã¿ã¢ãã«ã®äœæ
- ã³ã³ããã¹ãã®åæåïŒç°å¢ïŒ
ã³ã¢ããŒã¿ãã¬ãŒã ã¯ãŒã¯ã®è¿œå
Objective-Cã®äžçã§ã¯ãã©ã€ãã©ãªã¯ãã¬ãŒã ã¯ãŒã¯ãšåŒã°ããŸãã
ãã¯ãªãŒã³ããããžã§ã¯ãã§æ¢ã«æ¥ç¶ãããŠããæšæºãã¬ãŒã ã¯ãŒã¯ã§ãæãé »ç¹ã«è¡šç€ºããããã®ïŒ
- ãŠã€ããã
- åºç€
- ã³ã¢ã°ã©ãã£ãã¯ã¹
æ°ãããã¬ãŒã ã¯ãŒã¯ã¯ã©ãã«è¿œå ãããŸããïŒ
æ¥ç¶ãããã¬ãŒã ã¯ãŒã¯ãéžæããŸãã
ããŒã¿ã¢ãã«ã®äœæ
ããŒã¿ã¢ãã«ããªããã°ãå®å šãªCore Dataã¢ããªã±ãŒã·ã§ã³ãšã¯èŠãªãããŸããã ããŒã¿ã¢ãã«ã¯ãã³ã¢ããŒã¿ã«ãã£ãŠç®¡çããããã¹ãŠã®ãšã³ãã£ãã£ãèšè¿°ããŸãã
æ°ããããŒã¿ã¢ãã«ãäœæããã«ã¯ïŒ[ãã¡ã€ã«]-> [æ°èŠ]-> [æ°ãããã¡ã€ã«]
ã¢ãã«ãMyModel.xcdatamodeldãšåŒã³ãŸãïŒ
ã¢ãã«ã®äœæåŸããšã³ãã£ãã£ãç·šéïŒäœæïŒããããã®ãŠã£ã³ããŠãéããŸãã
Xcodeã®å·Šäžã«ãã[+]ãã¿ã³ãã¯ãªãã¯ããŠæ°ãããšã³ãã£ãã£ãäœæãã[å±æ§]ã»ã¯ã·ã§ã³ã«æ¢ã«ãã[+]ãã¿ã³ãã¯ãªãã¯ããŠæ°ãããšã³ãã£ãã£å±æ§ãè¿œå ãããã®ã¿ã€ããéžæããŸãã
ã³ã³ããã¹ãã®åæåïŒç°å¢ïŒ
æåŸã®æé ã¯ãã³ã³ããã¹ããã¹ãã¬ãŒãžãããã³ãªããžã§ã¯ãã¢ãã«ãåæåããããšã§ãã ã»ãšãã©ã®å ŽåãCore Dataã䜿çšããã空ã®ããããžã§ã¯ãã§Xcodeã«ãã£ãŠèªåçã«çæãããã³ãŒãã䜿çšã§ããŸãã
DemoAppAppDelegate.h
#import <UIKit/UIKit.h> #import <CoreData/CoreData.h> @interface DemoAppDelegate : UIResponder <UIApplicationDelegate> { } @property (strong, nonatomic) UIWindow *window; @property (strong, nonatomic) UINavigationController *navigationController; @property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel; @property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext; @property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator; - (void)saveContext; - (NSURL *)applicationsDocumentsDirectory; @end
* .mãã¡ã€ã«DemoAppAppDelegateã«åãæ¿ããŠã次ã®è¡ãèšè¿°ããŸãã
@synthesize managedObjectContext = _managedObjectContext; @synthesize managedObjectModel = _managedObjectModel; @synthesize persistentStoreCoordinator = _persistentStoreCoordinator;
以äžã¯ãããŒã¿ã¢ãã«ãã¹ãã¬ãŒãžãããã³ã³ã³ããã¹ããåæåããã³ãŒãã§ãã
- (NSManagedObjectModel *)managedObjectModel { if (_managedObjectModel != nil){ return _managedObjectModel; } NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"MyModel" withExtension:@"momd"]; _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modeURL]; return _managedObjectModel; }
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { if(_persistentStoreCoordinator != nil){ return _persistentStoreCoordinator; } NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"DemoApp.sqlite"]; NSError *error = nil; _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]]; if(![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error&error]){ NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); } return _persistentStoreCoordinator; }
- (NSManagedObjectContext *)managedObjectContext { if(_managedObjectContext != nil){ return _managedObjectContext; } NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; if(coordinator != nil){ _managedObjectContext = [[NSManagedObjectContext alloc] init]; [_managedObjectContext setPersistentStoreCoordinator:coordinator]; } return _managedObjectContext; }
ãããŸã§ã«å®è£ ããããšã®ãªãã¡ãœããïŒ
- (NSURL *)applicationDocumentsDirectory{ return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; }
- (void)saveContext { NSError *error = nil; NSManagedObjectContext *managedObjectContext = [self managedObjectContext]; if(managedObjectContext != nil) { if([managedObjectContext hasChanges] && ![managedObjectContext save:&error]){ NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); } } }
ã³ã¢ããŒã¿ãæ¥ç¶ããã®ã§ãã¢ããªã±ãŒã·ã§ã³ã¯ããã䜿çšããŠããŒã¿ãä¿åã§ããŸãã
ãã¹ãŠãæ£åžžã«æ©èœããããŒã¿ãå®éã«ä¿åãããããšã確èªã§ããç°¡åãªäŸãå®è£ ããŸãããã
ãã¹ãäŸã§ã¯ãã¢ããªã±ãŒã·ã§ã³ãèµ·åãããåæ°ãå€æããŸãã
ã¢ããªã±ãŒã·ã§ã³ã«å°ããªå€æŽãå ããŸããã¢ããªã±ãŒã·ã§ã³ã以åã«èµ·åãããåæ°ãåãåããæ°ããèµ·åã€ãã³ããè¿œå ãããšãã圢ã§ãã¢ããªã±ãŒã·ã§ã³ããªã²ãŒãã®didFinishLaunchingWithOptionsïŒã¡ãœãããè¡ããŸãã
以åã®ã¢ããªã±ãŒã·ã§ã³ã®èµ·åãååŸããããã®ã³ãŒãïŒ
NSManagedObjectContext *context = [self managedObjectContext]; NSFetchRequest *request = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyData" inManagedObjectContext:context]; [request setEntity:entity]; NSArray *results = [context executeFetchRequest:request error:nil];
次ã«ã次ã®ããã«é åå šäœã調ã¹ãŸãã
for(NSManagedObject *object in results){ NSLog(@"Found %@", [object valueForKey:@"myAttribute"]; }
æ°ãããšã³ããªãè¿œå ããŠä¿åããŸãã
NSString *launchTitle = [NSString stringWithFormat:@"launch %d", [results count]]; NSManagedObject *object = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context]; [object setValue:launchTitle forKey:@"myAttribute"]; [self saveContext]; NSLog(@"Added : %@", launchTitle);
æåã®èµ·ååŸãã¢ããªã±ãŒã·ã§ã³ã¯ã³ã³ãœãŒã«ã«æ¬¡ã®è¡ã衚瀺ããŸãã
2011â02-25 05:13:23.783 DemoApp[2299:207] Added: launch 0
2åç®ã®å®è¡åŸïŒ
2011â02-25 05:15:48.883 DemoApp[2372:207] Found launch 0 2011â02-25 05:15:48.889 DemoApp[2372:207] Added: launch 1
å®å šãªæ¹æ³ã¯æ¬¡ã®ãšããã§ãã
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { NSManagedObjectContext *context = [self managedObjectContext]; NSFetchRequest *request = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entytyForName:@"MyData" inManagedObjectContext:context]; [request setEntity:entity]; NSArray *results = [context executeFetchRequest:request error:nil]; for(NSManagedObject *object in results){ NSLog(@"Found %@", [object valueForKey:@"myAttribute"]); } NSString *launchTitle = [NSString stringWithFormat:@"launch %d", [results count]]; NSManagedObject *object = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context]; [object setValue:launchTitle forKey:@"myAttribute"]; [self saveContext]; NSLog(@"Added : %@", launchTitle); [self.window makeKeyAndVisible]; return YES; }
çµè«ãšããŠ
ã³ã¡ã³ãã®èª€ãã«ã€ããŠã¯æžããªãããã«ãé¡ãããŸããããã«ãã©ã€ããŒãã¡ãã»ãŒãžãæžãããšããå§ãããŸãã
転éãç¶è¡ããå¿ èŠããããŸããïŒ ãã®ãããã¯ã«èå³ã¯ãããŸããïŒ
ãæž èŽããããšãããããŸããïŒ