Core Data浅谈系列之二 : 简单的CURD
来源:互联网 发布:淘宝怎么进入对方社区 编辑:程序博客网 时间:2024/05/16 07:07
在上一篇中简单介绍了Core Data Stack,自上而下地对Core Data应用结构有个基本的认识,不过都是理论上的。这里就以上一篇的理论构建起一个可运行的Demo,执行一些简单的增删改查操作。
(图片来自Apple)
首先,我们需要建立如上图的栈结构。因此,在ViewController里添加3个属性:
@interface ViewController : UIViewController@property (nonatomic, retain) NSManagedObjectModel *managedObjectModel;@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;@property (nonatomic, retain) NSPersistentStoreCoordinator *persistentStoreCoordinator;@end
根据前文讨论的顺序,我们首先创建managedObjectModel(在那之前需要引入CoreData Framework):
- (NSManagedObjectModel *)managedObjectModel{ if (nil != _managedObjectModel) { return _managedObjectModel; } _managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain]; return _managedObjectModel;}
接着创建NSManagedObject的生存环境 —— NSManagedObjectContext:
- (NSManagedObjectContext *)managedObjectContext{ if (nil != _managedObjectContext) { return _managedObjectContext; } _managedObjectContext = [[NSManagedObjectContext alloc] init]; return _managedObjectContext;}
由于Demo会将数据存储到本地文件,所以还需要NSPersistentStoreCoordinator和NSManagedObjectContext配合。
下面是创建Core Data栈结构的完整代码:
#pragma mark - #pragma mark - Core Data Stack- (NSManagedObjectModel *)managedObjectModel{ if (nil != _managedObjectModel) { return _managedObjectModel; } _managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain]; return _managedObjectModel;}- (NSManagedObjectContext *)managedObjectContext{ if (nil != _managedObjectContext) { return _managedObjectContext; } _managedObjectContext = [[NSManagedObjectContext alloc] init]; if (self.persistentStoreCoordinator) { [_managedObjectContext setPersistentStoreCoordinator:self.persistentStoreCoordinator]; } return _managedObjectContext;}- (NSPersistentStoreCoordinator *)persistentStoreCoordinator{ if (nil != _persistentStoreCoordinator) { return _persistentStoreCoordinator; } NSString *storeType = NSSQLiteStoreType; NSString *storeName = @"cdNBA.sqlite"; NSError *error = NULL; NSURL *storeURL = [NSURL fileURLWithPath:[[self applicationDocumentsDirectory] stringByAppendingPathComponent:storeName]]; _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel]; if (![_persistentStoreCoordinator addPersistentStoreWithType:storeType configuration:nilURL:storeURL options:nil error:&error]) { NSLog(@"Error : %@\n", [error localizedDescription]); NSAssert1(YES, @"Failed to create store %@ with NSSQLiteStoreType", [storeURL path]); } return _persistentStoreCoordinator;}#pragma mark -#pragma mark Application's Documents Directory- (NSString *)applicationDocumentsDirectory{ NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil; return basePath;}
在搭建完基础的Core Data栈结构后,就可以写一些简单的CURD代码了:
#pragma mark - #pragma mark - CURD Operations- (BOOL)createTeamWithName:(NSString *)teamName city:(NSString *)teamCity{ if (!teamName || !teamCity) { return NO; } NSManagedObject *teamObject = [NSEntityDescription insertNewObjectForEntityForName:@"Team" inManagedObjectContext:self.managedObjectContext]; [teamObject setValue:teamName forKey:@"name"]; [teamObject setValue:teamCity forKey:@"city"]; return YES;}- (NSArray *)fetchTeamList{ NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; [fetchRequest setEntity:[NSEntityDescription entityForName:@"Team" inManagedObjectContext:self.managedObjectContext]]; NSError *error = NULL; NSArray *array = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error]; if (error) { NSLog(@"Error : %@\n", [error localizedDescription]); } [fetchRequest release], fetchRequest = nil; return array;}
我们可以把读写的代码放到viewDidLoad函数中:
- (void)viewDidLoad{ [superviewDidLoad];// Do any additional setup after loading the view, typically from a nib. [self createTeamWithName:@"Heat"city:@"Miami"]; [self createTeamWithName:@"Lakers"city:@"LA"]; [self saveContext]; NSArray *teamArray = [self fetchTeamList]; if (teamArray) { for (NSManagedObject *teamObject in teamArray) { NSString *teamName = [teamObject valueForKey:@"name"]; NSString *teamCity = [teamObject valueForKey:@"city"]; NSLog(@"Team info : %@, %@\n", teamName, teamCity); } }}
由于在context中创建的对象只是存在于内存中,所以我们还需要显式地把数据保存到sqlite文件里:
#pragma mark -#pragma mark - Save Context- (void)saveContext{ NSError *error = NULL; NSManagedObjectContext *moc = self.managedObjectContext; if (moc && [moc hasChanges] && ![moc save:&error]) { NSLog(@"Error %@, %@", error, [error localizedDescription]); abort(); }}
最后,就是跑一下Demo,检验一下结果。
执行过一次程序后,我们可以搜索下cdNBA.sqlite文件,然后查看里面的数据:
同时,控制台也输出了数据:
2013-01-16 14:32:52.638 cdNBA[4717:c07] Team info : Heat, Miami2013-01-16 14:32:52.639 cdNBA[4717:c07] Team info : Lakers, LA
Brief Talk About Core Data Series, Part 2 : Simple CURD
Jason Lee @ Hangzhou
Blog : http://blog.csdn.net/jasonblog
Weibo : http://weibo.com/jasonmblog
- Core Data浅谈系列之二 : 简单的CURD
- Core Data浅谈系列之二 : 简单的CURD
- Core Data浅谈系列之二 : 简单的CURD
- Core Data浅谈系列之二 : 简单的CURD
- Core Data浅谈系列之二 : 简单的CURD
- Core Data浅谈系列之二 : 简单的CURD
- Core Data浅谈系列之四 : 数据模型的版本变迁
- Core Data浅谈系列之四 : 数据模型的版本变迁
- Core Data浅谈系列之四 : 数据模型的版本变迁
- Core Data浅谈系列之四 : 数据模型的版本变迁
- Core Data浅谈系列之四 : 数据模型的版本变迁
- Core Data浅谈系列汇总
- Core Data浅谈系列之三 : 了解NSManagedObject和NSPredicate
- Core Data浅谈系列之五 : 在UITableView中展示
- Core Data浅谈系列之六 : 验证用户输入
- Core Data浅谈系列之七 : 使用NSFetchedResultsController
- Core Data浅谈系列之八 : 关于并发
- Core Data浅谈系列之九 : 使用Mapping Model
- 学习iPhone UIKit 2
- 字符全排列
- Android 的消息队列模型
- matlab 图像工具箱 Identifying Round Objects
- 全局变量
- Core Data浅谈系列之二 : 简单的CURD
- 挑战编程 程序设计竞赛训练手册-1.6.2 扫雷(Minesweeper)
- android中的动画有哪几类,它们的特点和区别是什么?
- centos6 vim 配置
- 【北大天网搜索引擎TSE学习笔记】第4节——实现搜索功能的入口程序
- MD5算法的C++实现
- android环境搭建
- java进制转换和字符编码问题
- android动画控制 Interpolator