`
anlulu
  • 浏览: 41819 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ios中的core data 详细介绍

    博客分类:
  • ios
阅读更多

1.介绍

core data 在ios的sdk中是一个强大的框架,允许程序员去管理数据存储用面向对象的方式,传统上,程序员保存数据都是用文件归档的形式保存到硬盘上,读写都采用手动的方式去管理,既麻烦又耗时,而core data的出现,将在数据存贮方面大大提高效率。它很想java里面的hibernate.

 

core data 是 ios的程序但是需要一点设置,幸运的是,通过xcode,创建core data将变得非常简单,通过下面的介绍,让我们在xcode上创建一个 core data project:

 

  1. 打开xcode
  2. 从file menu中,选中New->new Project.....
  3. 在新工程的对话框中,确定左边选中的工程是在ios下,然后在左边的对话框中,选Empty Application,点击Next,如图:1-1

     1-1 
  4. 在你的工程界面,确认你的checkbox:use core data 选中,点击 Next,如图:1-2

     

     
  5. 现在你必须选择你的工程保存的目录,选中目标文件夹,点击创建按钮,如图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 

  • 解决方案
    打开你的项目中已经存在的CoreDataDemo1.xcdatamodeld,单击出现下面的界面:figure 1-4
 

 figure 1-4

点击Add Entity按钮添加一个实体,并且重命名为Friend,在左边依次添加属性  如图:figure 1-5

  • age(Integer 16)
  • name(String)
  • telphone(Integer 16)


 figure 1-5
 

1.2生成实体类 

 步骤如下:

  1. 在xcode中,找到后缀名.xcdatamodeld文件,右键点击添加一个文件,如图:figure 1-6

     
  2. 点击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;
}
  1.  在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,数据添加成功,看,是不是很简单,我们还可以对数据进行删除,修改,查询,等操作,还有利用tableview,把数据显示到表格中,进行一些列的操作,幸好,苹果的官方文档中,为我们集成了NSFetchedResultsController,这个控制器可以hi很好的帮我们完成工作,下个章节,我会详细介绍。

 

 figure 1-10

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 大小: 207.2 KB
  • 大小: 147 KB
  • 大小: 224.1 KB
  • 大小: 172.9 KB
  • 大小: 216.7 KB
  • 大小: 253.3 KB
  • 大小: 204.1 KB
  • 大小: 19.8 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics