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     }

 

posted @ 2013-12-16 20:35  激情为梦想而生  阅读(213)  评论(0编辑  收藏  举报