CoreData
CoreData的使用:
第一步:创建一个 DataDemo.xcdatamodel 文件,在其中建一个实体名字为 Entity1 ,实体中建两个字段 id 和 name。
第二步:为项目添加 CoreData.framework 框架,然后在 .pch 中加入 #import <coredata/coredata.h>
第三步:在 app delegate 中定义 core data 的相关对象(同时完成它们的初始化工作)
.h 文件:
1 #import <coredata/coredata.h> 2 @private NSManagedObjectModel *managedObjectModel; NSManagedObjectContext *managedObjectContext; NSPersistentStoreCoordinator *persistentStoreCoordinator; 3 @property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel; 4 @property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext; 5 @property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator; 6 - (NSString*) applicationDocumentsDirectory; 7 - (void) saveContext;
.m 文件:
1 @synthesize managedObjectModel; 2 @synthesize managedObjectContext; 3 @synthesize persistentStoreCoordinator; 4 - (void)dealloc { 5 [managedObjectModel release]; 6 [managedObjectContext release]; 7 [persistentStoreCoordinator release]; 8 [super dealloc]; 9 } 10 - (NSString*)applicationDocumentsDirectory{ 11 //return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 12 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 13 //判断document目录下是否存在文件夹,如果为0则置为nil 14 NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil; 15 return basePath; 16 //return [NSURL URLWithString:basePath]; 17 } 18 - (void)saveContext{ 19 NSError *error = nil; 20 NSManagedObjectContext *objectContext = self.managedObjectContext; 21 if (objectContext != nil){ 22 if ([objectContext hasChanges] && ![objectContext save:&error]) { 23 NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 24 abort(); 25 } 26 } 27 } 28 - (NSManagedObjectContext *)managedObjectContext{ 29 if (managedObjectContext != nil) { 30 return managedObjectContext; 31 } 32 NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 33 if (coordinator != nil) { 34 managedObjectContext = [[NSManagedObjectContext alloc] init]; 35 [managedObjectContext setPersistentStoreCoordinator:coordinator]; 36 } 37 return managedObjectContext; 38 } 39 - (NSManagedObjectModel *)managedObjectModel{ 40 if (managedObjectModel != nil) { 41 return managedObjectModel; 42 } 43 //从本地所有 xcdatamodel 文件中获得这个 CoreData 的数据模板 44 managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain]; 45 return managedObjectModel; 46 } 47 - (NSPersistentStoreCoordinator *)persistentStoreCoordinator{ 48 if (persistentStoreCoordinator != nil) { 49 return persistentStoreCoordinator; 50 } 51 //数据库名为TestDB.sqlite 52 NSURL *storeUrl = [NSURL fileURLWithPath:[[self applicationDocumentsDirectory] stringByAppendingPathComponent:@"TestDB.sqlite"]]; 53 NSError *error; 54 persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 55 if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&error]) { 56 NSAssert(0, @"persistentStoreCoordinator init failed!"); 57 } 58 return persistentStoreCoordinator; 59 } 60 - (void)applicationWillTerminate:(UIApplication *)application{ 61 NSError *error; 62 if (managedObjectContext != nil) { 63 if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) { 64 NSAssert(0, @"save changes failed when terminage application!"); 65 } 66 } 67 }
第四步:在相关的 viewcontroller 中操作数据,基本的 core data 操作代码如下:
1 NSError *error; 2 testSQLiteAppDelegate *app = (testSQLiteAppDelegate*)[[UIApplication sharedApplication] delegate]; 3 NSManagedObjectContext *context = app.managedObjectContext; 4 //1、插入 5 NSManagedObject *newManagedObject = nil; 6 newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:@"Entity1" inManagedObjectContext:context]; 7 [newManagedObject setValue:[NSNumber numberWithInt:1] forKey:@"id"]; 8 [newManagedObject setValue:@"i love you" forKey:@"name"]; 9 if (![context save:&error]){ 10 NSLog (@"The error is: %@", [error userInfo]); 11 } else { 12 NSLog (@"The newManagedObject's id is: %@", [newManagedObject valueForKey:@"id"]); 13 } 14 //2、查询 15 NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 16 NSEntityDescription *entity = [NSEntityDescription entityForName:@"Entity1" inManagedObjectContext:context]; 17 NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"id" ascending:YES]; 18 NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES]; 19 NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor1, sortDescriptor2, nil]; 20 [fetchRequest setSortDescriptors:sortDescriptors]; 21 [fetchRequest setEntity:entity]; [fetchRequest setFetchBatchSize:20]; 22 NSArray *objects = [context executeFetchRequest: fetchRequest error:&error]; 23 if (objects == nil) { 24 NSLog(@"There was an error!"); 25 } else { 26 for (NSManagedObject *oneObject in objects) { 27 NSLog(@"%@",[oneObject valueForKey:@"name"]); 28 } 29 } 30 //3、删除 31 [context deleteObject:[objects objectAtIndex:0]]; 32 if (![context save:&error]) { 33 exit(-1); 34 }
这里更详细的补充一点关于 core data 的操作代码:
1、条件过滤:选择 cid=1 的数据
1 - (NSFetchedResultsController*) fetchedResultsController { 2 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"cid=1"]; 3 [fetchRequest setPredicate:predicate]; 4 }
2、通用代码,在 viewcontroller 里面会用到:
TestViewController.h 的代码:
1 @interface TestViewController : UITableViewController <NSFetchedResultsControllerDelegate>{ 2 NSFetchedResultsController *fetchedResultsController; 3 NSManagedObjectContext *managedObjectContext; 4 } 5 @property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController; 6 @property (nonatomic, retain) NSManagedObjectContext *managedObjectContext; 7 - (void)configureCell:(UITableViewCell *)cell withCategory:(Category *)category; 8 @end
TestViewController.m 的代码:
1 -(NSFetchedResultsController *)fetchedResultsController { 2 if (fetchedResultsController != nil){ 3 return fetchedResultsController; 4 } 5 NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 6 NSEntityDescription *entity = [NSEntityDescription entityForName:@"Category" inManagedObjectContext managedObjectContext]; 7 [fetchRequest setEntity:entity]; 8 NSSortDescriptor *nameDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES]; 9 NSArray *arraySortDescriptor = [[NSArray alloc] initWithObjects:nameDescriptor, nil]; 10 [fetchRequest setSortDescriptors:arraySortDescriptor]; 11 NSPredicate *predicate = [NSPredicate predicateWithFormat:cidString]; 12 [fetchRequest setPredicate:predicate]; 13 NSFetchedResultsController *frController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:@"name" cacheName:@"Root"]; 14 frController.delegate = self; 15 self.fetchedResultsController = frController; 16 [frController release]; 17 [fetchRequest release]; 18 [nameDescriptor release]; 19 return fetchedResultsController; 20 } 21 - (void)controllerWillChangeContent:(NSFetchedResultsController *) { 22 [self.tableView beginUpdates]; 23 } 24 - (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType: (NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath { UITableView *tableView = self.tableView; 25 switch (type) { 26 case NSFetchedResultsChangeInsert: 27 [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade]; 28 break; 29 case NSFetchedResultsChangeDelete:[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 30 break; 31 case NSFetchedResultsChangeMove:[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 32 [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade]; 33 break; 34 case NSFetchedResultsChangeUpdate: 35 [self configureCell:[tableView cellForRowAtIndexPath:indexPath] withCategory:anObject]; 36 break; 37 default: 38 break; 39 } 40 } 41 - (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type { 42 switch(type) { 43 case NSFetchedResultsChangeInsert:[self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade]; 44 break; 45 case NSFetchedResultsChangeDelete:[self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade]; 46 break; 47 } 48 } 49 - (void) controllerDidChangeContent:(NSFetchedResultsController *)controller { 50 [self.tableView endUpdates]; 51 }
激情为梦想而生