分享

CoreData的增删改查

 求知665 2015-08-03

近几天一直在使用 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 stack
22 - (NSManagedObjectContext *)managedObjectContext
23 {
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 *)managedObjectModel
38 {
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 *)persistentStoreCoordinator
48 {
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 directory
67 - (NSURL *)applicationDocumentsDirectory
68 {
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条评论

    发表

    请遵守用户 评论公约

    类似文章 更多