Core Data浅谈系列之二 : 简单的CURD

原帖地址:http://blog.csdn.net/jasonblog/article/details/8526148

上一篇中简单介绍了Core Data Stack,自上而下地对Core Data应用结构有个基本的认识,不过都是理论上的。这里就以上一篇的理论构建起一个可运行的Demo,执行一些简单的增删改查操作。


(图片来自Apple)

首先,我们需要建立如上图的栈结构。因此,在ViewController里添加3个属性:
[cpp]  view plain copy
  1. @interface ViewController : UIViewController  
  2.   
  3. @property (nonatomic, retain) NSManagedObjectModel *managedObjectModel;  
  4. @property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;  
  5. @property (nonatomic, retain) NSPersistentStoreCoordinator *persistentStoreCoordinator;  
  6.   
  7. @end  

根据前文讨论的顺序,我们首先创建managedObjectModel(在那之前需要引入CoreData Framework):

[cpp]  view plain copy
  1. - (NSManagedObjectModel *)managedObjectModel  
  2. {  
  3.     if (nil != _managedObjectModel) {  
  4.         return _managedObjectModel;  
  5.     }  
  6.       
  7.     _managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];  
  8.     return _managedObjectModel;  
  9. }  
接着创建NSManagedObject的生存环境 —— NSManagedObjectContext:
[cpp]  view plain copy
  1. - (NSManagedObjectContext *)managedObjectContext  
  2. {  
  3.     if (nil != _managedObjectContext) {  
  4.         return _managedObjectContext;  
  5.     }  
  6.       
  7.     _managedObjectContext = [[NSManagedObjectContext alloc] init];  
  8.     return _managedObjectContext;  
  9. }  
由于Demo会将数据存储到本地文件,所以还需要NSPersistentStoreCoordinator和NSManagedObjectContext配合。
下面是 创建Core Data栈结构的完整代码:
[cpp]  view plain copy
  1. #pragma mark -   
  2. #pragma mark - Core Data Stack  
  3.   
  4. - (NSManagedObjectModel *)managedObjectModel  
  5. {  
  6.     if (nil != _managedObjectModel) {  
  7.         return _managedObjectModel;  
  8.     }  
  9.       
  10.     _managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];  
  11.     return _managedObjectModel;  
  12. }  
  13.   
  14. - (NSManagedObjectContext *)managedObjectContext  
  15. {  
  16.     if (nil != _managedObjectContext) {  
  17.         return _managedObjectContext;  
  18.     }  
  19.       
  20.     _managedObjectContext = [[NSManagedObjectContext alloc] init];  
  21.       
  22.     if (self.persistentStoreCoordinator) {  
  23.         [_managedObjectContext setPersistentStoreCoordinator:self.persistentStoreCoordinator];  
  24.     }  
  25.       
  26.     return _managedObjectContext;  
  27. }  
  28.   
  29. - (NSPersistentStoreCoordinator *)persistentStoreCoordinator  
  30. {  
  31.     if (nil != _persistentStoreCoordinator) {  
  32.         return _persistentStoreCoordinator;  
  33.     }  
  34.       
  35.     NSString *storeType = NSSQLiteStoreType;  
  36.     NSString *storeName = @"cdNBA.sqlite";  
  37.       
  38.     NSError *error = NULL;  
  39.     NSURL *storeURL = [NSURL fileURLWithPath:[[self applicationDocumentsDirectory] stringByAppendingPathComponent:storeName]];  
  40.       
  41.     _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel];  
  42.     if (![_persistentStoreCoordinator addPersistentStoreWithType:storeType configuration:nilURL:storeURL options:nil error:&error]) {  
  43.         NSLog(@"Error : %@\n", [error localizedDescription]);  
  44.         NSAssert1(YES, @"Failed to create store %@ with NSSQLiteStoreType", [storeURL path]);  
  45.     }  
  46.       
  47.     return _persistentStoreCoordinator;  
  48. }  
  49.   
  50. #pragma mark -  
  51. #pragma mark Application's Documents Directory  
  52.   
  53. - (NSString *)applicationDocumentsDirectory  
  54. {  
  55.     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
  56.     NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;  
  57.     return basePath;  
  58. }  

在搭建完基础的Core Data栈结构后,就可以写一些简单的CURD代码了:

[cpp]  view plain copy
  1. #pragma mark -   
  2. #pragma mark - CURD Operations  
  3.   
  4. - (BOOL)createTeamWithName:(NSString *)teamName city:(NSString *)teamCity  
  5. {  
  6.     if (!teamName || !teamCity) {  
  7.         return NO;  
  8.     }  
  9.       
  10.     NSManagedObject *teamObject = [NSEntityDescription insertNewObjectForEntityForName:@"Team" inManagedObjectContext:self.managedObjectContext];  
  11.     [teamObject setValue:teamName forKey:@"name"];  
  12.     [teamObject setValue:teamCity forKey:@"city"];  
  13.       
  14.     return YES;  
  15. }  
  16.   
  17. - (NSArray *)fetchTeamList  
  18. {  
  19.     NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];  
  20.     [fetchRequest setEntity:[NSEntityDescription entityForName:@"Team" inManagedObjectContext:self.managedObjectContext]];  
  21.       
  22.     NSError *error = NULL;  
  23.     NSArray *array = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];  
  24.     if (error) {  
  25.         NSLog(@"Error : %@\n", [error localizedDescription]);  
  26.     }  
  27.       
  28.     [fetchRequest release], fetchRequest = nil;  
  29.       
  30.     return array;  
  31. }  

我们可以把读写的代码放到viewDidLoad函数中:

[cpp]  view plain copy
  1. - (void)viewDidLoad  
  2. {  
  3.     [superviewDidLoad];  
  4. // Do any additional setup after loading the view, typically from a nib.  
  5.       
  6.     [self createTeamWithName:@"Heat"city:@"Miami"];  
  7.     [self createTeamWithName:@"Lakers"city:@"LA"];  
  8.     [self saveContext];  
  9.       
  10.     NSArray *teamArray = [self fetchTeamList];  
  11.     if (teamArray) {  
  12.         for (NSManagedObject *teamObject in teamArray) {  
  13.             NSString *teamName = [teamObject valueForKey:@"name"];  
  14.             NSString *teamCity = [teamObject valueForKey:@"city"];  
  15.             NSLog(@"Team info : %@, %@\n", teamName, teamCity);  
  16.         }  
  17.     }  
  18. }  

由于在context中创建的对象只是存在于内存中,所以我们还需要显式地把数据保存到sqlite文件里:

[cpp]  view plain copy
  1. #pragma mark -  
  2. #pragma mark - Save Context  
  3.   
  4. - (void)saveContext  
  5. {  
  6.     NSError *error = NULL;  
  7.     NSManagedObjectContext *moc = self.managedObjectContext;  
  8.     if (moc && [moc hasChanges] && ![moc save:&error]) {  
  9.         NSLog(@"Error %@, %@", error, [error localizedDescription]);  
  10.         abort();  
  11.     }  
  12. }  
最后,就是跑一下Demo,检验一下结果。
执行过一次程序后,我们可以搜索下cdNBA.sqlite文件,然后查看里面的数据: 



同时,控制台也输出了数据:
[plain]  view plain copy
  1. 2013-01-16 14:32:52.638 cdNBA[4717:c07] Team info : Heat, Miami  
  2. 2013-01-16 14:32:52.639 cdNBA[4717:c07] Team info : Lakers, LA  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值