1.介绍
core data 在ios的sdk中是一个强大的框架,允许程序员去管理数据存储用面向对象的方式,传统上,程序员保存数据都是用文件归档的形式保存到硬盘上,读写都采用手动的方式去管理,既麻烦又耗时,而core data的出现,将在数据存贮方面大大提高效率。它很想java里面的hibernate.
core data 是 ios的程序但是需要一点设置,幸运的是,通过xcode,创建core data将变得非常简单,通过下面的介绍,让我们在xcode上创建一个 core data project:
- 打开xcode
- 从file menu中,选中New->new Project.....
- 在新工程的对话框中,确定左边选中的工程是在ios下,然后在左边的对话框中,选Empty Application,点击Next,如图:1-1
1-1 - 在你的工程界面,确认你的checkbox:use core data 选中,点击 Next,如图:1-2
- 现在你必须选择你的工程保存的目录,选中目标文件夹,点击创建按钮,如图1-3
figure 1-3
因为我创建的是universal,所以这是一个既适用于ipad也适用于iphone的一个工程,现在假如你看的AppDelegate.h 文件,你会发现多了3个属性
- managedObjectContext(属于NSManagedObjectContext类型)
- managedObjectModal(属于NSManagedModal类型)
- persistentStoreCoordintor(属于NSpersistentStoreCoodintor类型)
我知道这些概念可能会困扰你,但是和那些oracel,DB2已经存在的数据库概念相比,这些这是小巫见大巫,简单的不得了:
NSpersistentStoreCoodintor:
这是连接物理的存储数据库文件和我们的应用程序之间的一座桥梁,这个桥梁能够管理不同的数据库上下文(NSmanagedObjectContext)
NSManagedObjectContext:
这是连接你的应用程序和object model中间的另外一座桥梁,通过这个上下文,你可以实现增删改查等操作
NSManagedModel:
这个和数据库中表的概念差不多,很像hibernate中的数据库表的映射文件,里面也包括了基本类型和一般数据类型,一对多,多对多,一对一的关系。
1.1创建一个coreData
- 解决方案
figure 1-4
点击Add Entity按钮添加一个实体,并且重命名为Friend,在左边依次添加属性 如图:figure 1-5
- age(Integer 16)
- name(String)
- telphone(Integer 16)
figure 1-5
1.2生成实体类
步骤如下:
- 在xcode中,找到后缀名.xcdatamodeld文件,右键点击添加一个文件,如图:figure 1-6
- 点击Next,选中当前工程保存,如图:figure 1-7
figure 1-7
现在,让我们看看我们的工程发现工程中多了两个文件,Friend.h和Friend.m文件,打开Friend.h文件,代码如下:
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
@interface Friend : NSManagedObject
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSNumber * age;
@property (nonatomic, retain) NSNumber * telphone;
@end
这个Friend.m代码如下:
#import "Friend.h" @implementation Friend @dynamic name; @dynamic age; @dynamic telphone; @end至此,我们的实体类已经创建完毕,是不是很easy!
当你用 xcode创建了你的数据模型,你可以创建data relationships,entities,atrributes.然而,为了让你的数据模型能在程序中运行,你必须为你的数据模型生成这些代码,你应该已经注意到了所有的属性都是 dynamically动态的,在.m文件中用@dynamic修饰你的实体类的属性,这个属性是告诉编辑器我会在运行时生成对应的属性方法。当然你也可以对这些属性进行重新赋值(只读或只写),你可以加载它们从上下文中。
1.3 用core data 创建和保存数据
你已经创建了一个数据实体你想去实例化它,并且把它插入到Core Data上下文中。
现在,你可以用NSEntityDescription的 insertObjectForEntityForName:inManagedObjectContext: 方法去创建一个实体,一旦这个实体创建之后,你能更改它的属性,当你这样做的之后,你可以用上下文去保存 save:instance
- 打开AppDelegate.m文件,代码片段:
-
@synthesize managedObjectContext = _managedObjectContext; @synthesize managedObjectModel = _managedObjectModel; @synthesize persistentStoreCoordinator = _persistentStoreCoordinator;
- 在程序加载完成后的方法里,代码如下:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
Friend *newFriend = [NSEntityDescription
insertNewObjectForEntityForName:@"Friend"
inManagedObjectContext:self.managedObjectContext];
if (newFriend != nil){
newFriend.name = @"Anthony";
newFriend.age = [NSNumber numberWithInt:21];
newFriend.telphone =@"15011557849";
NSError *savingError = nil;
if ([self.managedObjectContext save:&savingError]){
NSLog(@"Successfully saved the context.");
} else {
NSLog(@"Failed to save the context. Error = %@", savingError);
}
} else {
NSLog(@"Failed to create the new Friend.");
}
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}
- 在AppDelegate.m的下面,你会发现会有几个方法,分别是实现如下:
- 设置managedObjectModel,数据库的模型映射文件
- (NSManagedObjectModel *)managedObjectModel
{
if (_managedObjectModel != nil) {
return _managedObjectModel;
}
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"CoreDataDemo1" withExtension:@"momd"];
_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return _managedObjectModel;
}
- 数据库文件和程序之间的连接桥:创建它需要NSmanagedObject
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (_persistentStoreCoordinator != nil) {
return _persistentStoreCoordinator;
}
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"CoreDataDemo1.sqlite"];
NSError *error = nil;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return _persistentStoreCoordinator;
}
- 操作数据库的上下文,每个数据库的上下文,都要设置它被谁所管理,也就是要设置NSPersistentStoreCoordinator
- (NSManagedObjectContext *)managedObjectContext
{
if (_managedObjectContext != nil) {
return _managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
_managedObjectContext = [[NSManagedObjectContext alloc] init];
[_managedObjectContext setPersistentStoreCoordinator:coordinator];
}
return _managedObjectContext;
}
figure 1-10