CoreData的增删改查

来源:互联网 发布:淘宝假货改进 编辑:程序博客网 时间:2024/05/04 06:14

来源:http://www.cnblogs.com/ZeroHour/p/3671346.html

近几天一直在使用 CoreData, 以前觉得它是一门高深的技术, 等自己用了之后才觉得,它是那么的平易近人.

一: 首先我们要在创建应用程序的时候勾选 UseCoreData 选项, 当然也可以自己后期创建.

系统会生成如下AppDelegate.h的文件

复制代码
 1 #import <UIKit/UIKit.h> 2  3 @interface AppDelegate : UIResponder <UIApplicationDelegate> 4  5 @property (strong, nonatomic) UIWindow *window; 6  7 // 上下文对象 8 @property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext; 9 // 数据模型10 @property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;11 // 协调者12 @property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;13 14 // 在应用程序终止的时候会调用该方法15 - (void)saveContext;16 // 得到应用程序的 Documents 路径, 将数据库存在此目录下17 - (NSURL *)applicationDocumentsDirectory;18 19 @end
复制代码

AppDelegate.m 文件会多出如下几个方法:

复制代码
 1 - (void)applicationWillTerminate:(UIApplication *)application 2 { 3     // 保存上下文对象的方法在此调用(程序结束的时候) 4     [self saveContext]; 5 } 6  7 #pragma makr - save context 8 - (void)saveContext 9 {10     // 程序意外终止就会调用此方法11     NSError *error = nil;12     NSManagedObjectContext *managedObjectContext = self.managedObjectContext;13     if (managedObjectContext != nil) {14         if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {15             NSLog(@"Unresolved error %@, %@", error, [error userInfo]);16             abort();17         } 18     }19 }20 21 #pragma mark - Core Data stack22 - (NSManagedObjectContext *)managedObjectContext23 {24     // 创建上下文对象25     if (_managedObjectContext != nil) {26         return _managedObjectContext;27     }28     29     NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];30     if (coordinator != nil) {31         _managedObjectContext = [[NSManagedObjectContext alloc] init];32         [_managedObjectContext setPersistentStoreCoordinator:coordinator];33     }34     return _managedObjectContext;35 }36 37 - (NSManagedObjectModel *)managedObjectModel38 {39     // 创建数据模型40     if (_managedObjectModel != nil) {41         return _managedObjectModel;42     }43     NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"CoreDataDemo02" withExtension:@"momd"];44     _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];45     return _managedObjectModel;46 }47 - (NSPersistentStoreCoordinator *)persistentStoreCoordinator48 {49     // 创建协调者,也就是存储区50     if (_persistentStoreCoordinator != nil) {51         return _persistentStoreCoordinator;52     }53     54     NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"CoreDataDemo02.sqlite"];55     56     NSError *error = nil;57     _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];58     if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {59         NSLog(@"Unresolved error %@, %@", error, [error userInfo]);60         abort();61     }    62     63     return _persistentStoreCoordinator;64 }65 66 #pragma mark - Application's Documents directory67 - (NSURL *)applicationDocumentsDirectory68 {69     // 得到 Documents 目录70     return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];71 }
复制代码

这就是系统为我们搭建好的框架,我们只需要进行数据操作便可.

二: 1)我们要在 CoreData 模板下添加实体以及实体的属性,如图:

2) 新建文件, 集资选择 CoreData-->NSManagedObjectSubClass, 选择为 Person 实体创建类便可.如下:

Person.h 文件

复制代码
 1 #import <Foundation/Foundation.h> 2 #import <CoreData/CoreData.h> 3  4  5 @interface Person : NSManagedObject 6  7 @property (nonatomic, retain) NSString * firstName; 8 @property (nonatomic, retain) NSString * lastName; 9 @property (nonatomic, retain) NSNumber * age;10 11 @end
复制代码

Person.m 文件

复制代码
 1 #import "Person.h" 2  3  4 @implementation Person 5  6 @dynamic firstName; 7 @dynamic lastName; 8 @dynamic age; 9 10 @end
复制代码

现在我们的环境已经准备完毕:

三: 1) 写入数据

复制代码
 1 - (void)insertData 2 { 3     // 创建实体 4     Person * newPerson = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:self.managedObjectContext]; 5     // 赋值 6     if (newPerson != nil) { 7         newPerson.firstName = @"Zero"; 8         newPerson.lastName = @"Hour"; 9         newPerson.age = [NSNumber numberWithInt:20];10         11         // 保存数据12         NSError * savingError = nil;13         if ([self.managedObjectContext save:&savingError]) {14             NSLog(@"success");15         }else {16             NSLog(@"failed to save the context error = %@", savingError);17         }18     }else {19         NSLog(@"failed to create the new person");20     }21 }
复制代码

2) 删除数据

复制代码
 1 - (void)deleteData 2 { 3     NSFetchRequest * fetchRequest = [[NSFetchRequest alloc] init]; 4     NSEntityDescription * entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:self.managedObjectContext]; 5     [fetchRequest setEntity:entity]; 6      7     NSError * requestError = nil; 8     NSArray * persons = [self.managedObjectContext executeFetchRequest:fetchRequest error:&requestError]; 9     10     if ([persons count] > 0) {11         12         Person * lastPerson = [persons lastObject];13         // 删除数据14         [self.managedObjectContext deleteObject:lastPerson];15         if ([lastPerson isDeleted]) {16             NSLog(@"successfully deleted the last person");17             NSError * savingError = nil;18             if ([self.managedObjectContext save:&savingError]) {19                 NSLog(@"successfully saved the context");20 21             }else {22                 NSLog(@"failed to save the context error = %@", savingError);23             }24         }else {25         26             NSLog(@"failed to delete the last person");27         }28     }else {29         NSLog(@"could not find any person entity in the context");30     }31 }
复制代码

3) 更改数据

复制代码
 1 - (void)updateData 2 { 3     NSFetchRequest * fetchRequest = [[NSFetchRequest alloc] init]; 4     NSEntityDescription * entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:self.managedObjectContext]; 5     [fetchRequest setEntity:entity]; 6      7     NSError * requestError = nil; 8     NSArray * persons = [self.managedObjectContext executeFetchRequest:fetchRequest error:&requestError]; 9     10     if ([persons count] > 0) {11         12         Person * lastPerson = [persons lastObject];13         // 更新数据14         lastPerson.firstName = @"Hour";15         lastPerson.lastName = @"Zero";16         lastPerson.age = @21;17 18         NSError * savingError = nil;19         if ([self.managedObjectContext save:&savingError]) {20             NSLog(@"successfully saved the context");21             22         }else {23             NSLog(@"failed to save the context error = %@", savingError);24         }25 26 27     }else {28         NSLog(@"could not find any person entity in the context");29     }30 }
复制代码

4) 查询数据

复制代码
 1 - (void)findData 2 { 3     NSFetchRequest * fetchRequest = [[NSFetchRequest alloc] init]; 4     NSEntityDescription * entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:self.managedObjectContext]; 5     [fetchRequest setEntity:entity]; 6      7     // 设置排序条件 8     NSSortDescriptor * ageSort = [[NSSortDescriptor alloc] initWithKey:@"age" ascending:YES]; 9     NSSortDescriptor * firstNameSort = [[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:YES];10     NSArray * sortDescriptors = @[ageSort, firstNameSort];11     [fetchRequest setSortDescriptors:sortDescriptors];12     13     // 设置查询条件14     NSPredicate * agePre = [NSPredicate predicateWithFormat:@"age > 18"];15     [fetchRequest setPredicate:agePre];16     17     NSError * requestError = nil;18     NSArray * persons = [self.managedObjectContext executeFetchRequest:fetchRequest error:&requestError];19     int counter = 0;20     for (Person * thisPerson in persons) {21         NSLog(@"person-->%d, firstName = %@, lastName = %@, age = %d", counter, thisPerson.firstName, thisPerson.lastName, [thisPerson.age intValue]);22         counter ++;23     }24 }
复制代码

好了自己目前只学习了这么多, CoreData 是非常好用的, 我会更加深入的去学习的,再见!

0 0