coreData

CoreData提供了一种简便的对象持久化管理方法,使你可以不用关心数据的存储,只需要关心对象的增加、删除、更改、读写。

基本概念
托管对象(managed object)
一个托管对象代表你想要保存到数据存储中的一个对象。这在概念上类似于SQL中的一条记录, 并且通常也包含一些域,这些域对应于你想要保存的对象的属性。

数据存储(data store)
Core Data支持4中类型的数据存储:SQLiteStore, XMLStore, BinaryStore, InMemoryStore。

托管对象上下文(managed object context)
托管对象上下文类似于应用程序和数据存储之间的一块缓冲区。这块缓冲区包含所有未被写入数据存储的托管对象。你可以添加、删除、更改缓冲区内的托管对象。在很多时候,当你需要读、插入、删除对象时,你将会调用托管对象上下文的方法。
 
持久化存储协调器(persistent store coordinator)
持久化存储协调器处理到数据存储的连接,并且包含一些底层信息,像用到数据存储的名字和位置。这个类通常被托管对象上下文用到。
 
托管对象模型(managed object model)
托管对象模型是一个类,这个类包含每一个你想存储到数据存储中的托管对象的定义。
大概是这样一种层次关系:

使用CoreData

1 在你可以读或写模型对象到当前数据存储之前,你需要实例化托管对象模型、托管对象上下文、持久化存储协调器。
托管对象模型由NSManagedObjectModel类的一个实例表示。在一个工程中我们只需要为所有的.xcdatamodeld文件实例化一个对象。
NSManagedObjectModel* managedObjectModel = [NSManagedObjectModel
        mergedModelFromBundles:nil];
mergedModelFromBundles: 搜索工程中所有的.xcdatamodeld文件,并加载所有的实体到一个NSManagedObjectModel  实例中。
这样托管对象模型知道所有当前工程中用到的托管对象的定义

2 有了托管对象模型实例之后,我们就可以创建一个持久化协调器实例了。持久化协调器处理到数据存储的连接。大概是处理怎么把对象写到数据存储或怎么从数据存储读对象吧。

有了持久化协调器实例之后,我们需要提供一个数据存储给它管理。你可以通过发送addPersistentStoreWithType:configuration:URL:options:error:消息来实现。

4 最后一步就是实例化托管对象上下文。有了托管对象上下文,你就可以方便的管理对象了。

下面是使用的实例代码:
1 初始化
-(void) viewDidLoad

复制代码
//创建管理对象模型
    objectModel = [NSManagedObjectModel mergedModelFromBundles:nil];
    
    // 创建持久化数据存储协调器
    coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:objectModel];
    
    // 添加数据存储
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    // 创建一个SQLite数据库作为数据存储
    NSString *documentsDir = [paths objectAtIndex:0];
    NSString *filePath = [documentsDir stringByAppendingPathComponent:@"datastore.sqlite"];
    NSURL *databaseURL = [NSURL fileURLWithPath:filePath];
    
    NSError *error = nil;
    [coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:databaseURL options:nil error:&error];
    
    // 创建托管对象上下文
    objectContext = [[NSManagedObjectContext alloc] init];
    [objectContext setPersistentStoreCoordinator:coordinator];
复制代码
 

2 添加对象

复制代码
NSString* newName = nameField.text;
    NSString* newPhone = phoneField.text;
    NSString* newPostcode = postcodeField.text;
    
    ContactData *newContact = (ContactData *)[NSEntityDescription insertNewObjectForEntityForName:@"ContactData" inManagedObjectContext:objectContext];
    newContact.customerName = newName;
    newContact.phoneNumber = newPhone;
    newContact.postCode = newPostcode;
    
    NSError* error;
    
    if ([objectContext save:&error])
    {
        [self fetchExistingContactData];
        [tableofcontacts reloadData];
    }
复制代码

3 访问对象

复制代码
 NSFetchRequest* fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription* entityDescription = [NSEntityDescription entityForName:@"ContactData"
                                                         inManagedObjectContext:objectContext];
    [fetchRequest setEntity:entityDescription];
    
    NSError* error;
    existingContacts = [objectContext executeFetchRequest:fetchRequest error:&error];

///////////////////*****************************//////////////////////

#import "ViewController.h"

#import <CoreData/CoreData.h>

#import "User.h"

#import "WuGong.h"

@interface ViewController (){

    IBOutlet UITextField *_nameField;

    IBOutlet UITextField *_scoreField;

    NSManagedObjectContext *_context;//coreData管理上下文

}

 

- (IBAction)addUser:(id)sender;

- (IBAction)fetch:(id)sender;

 

@end

 

@implementation ViewController

 

- (void)viewDidLoad

{

    [super viewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

    

    //模型 user

    NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];

    //协调者(设置模型,路径)

    NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];

    //数据库路径

    NSString *path = [NSString stringWithFormat:@"%@/Documents/data2.db",NSHomeDirectory()];

    [coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[NSURL fileURLWithPath:path] options:nil error:nil];

    //上下文

    _context = [[NSManagedObjectContext alloc] init];

    //给上下文设置协调者

    _context.persistentStoreCoordinator = coordinator;

    

}

 

- (void)addUser:(id)sender{

    //创建一个User对象

    User *user = [NSEntityDescription insertNewObjectForEntityForName:@"User" inManagedObjectContext:_context];

    user.name = _nameField.text;

    user.score = [NSNumber numberWithInt:[_scoreField.text intValue]];

    //武功

    user.wugong = [NSEntityDescription insertNewObjectForEntityForName:@"WuGong" inManagedObjectContext:_context];

    user.wugong.name = @"降龙十八掌";

    //保存

    if ([_context save:nil]) {

        NSLog(@"保存成功");

    }else{

        NSLog(@"保存失败");

    }

}

 

- (void)fetch:(id)sender{

    //查询

    NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"User"];

    //排序

    NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"score" ascending:YES];

    [request setSortDescriptors:@[sort]];

    

    NSArray *array = [_context executeFetchRequest:request error:nil];

    for (User *user in array) {

        NSLog(@"%@:%@:%@",user.name,user.score,user.wugong.name);

        //修改

        if ([user.score intValue] == 60) {

            user.score = @70;

            if ([_context save:nil]) {

                NSLog(@"修改成功");

            }

        }

        //删除

        if ([user.score intValue] == 0) {

            [_context deleteObject:user];

            if ([_context save:nil]) {

                NSLog(@"删除成功");

            }

        }

    }

}

 

posted @ 2015-04-16 21:40  飞天至虹  阅读(87)  评论(0编辑  收藏  举报