您的位置:首页 > 其它

CoreData的增删改查--可行

2016-05-05 14:22 387 查看
近几天一直在使用 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 是非常好用的, 我会更加深入的去学习的,再见!
http://www.cnblogs.com/ZeroHour/p/3671346.html?utm_source=tuicool&utm_medium=referral
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: