iOS 7.1系统中 CoreData的使用方法

         我们在iOS开发中,常用的数据本地化存储方式无非就是这四种:1、属性列表;2、对象归档;3、SQLite3;4、CoreData;以上几种均较为常用,CoreData用的较少,就算项目中有所接触,精通的也不多。关于CoreData的基本概念介绍见:点我访问 。本文主要介绍CoreData的基本使用方法。好了,首先,创建一个CoreData项目,勾选CoreData选项。 然后,在项目中自动多出了几个文件,CoreDataDemo.xcdatamodeld , Entity.h,Entity.m文件。单击CoreDataDemo.xcdatamodeld文件,选择Add Entity,然后编辑Entity属性。本文中以一个创建普通记事本为栗子,定义日记本的三个基本属性,分别为日记内容(body),类型选择 String。创建日期creatDate,类型为Date,日记标题title,类型选择Sting。(是不是跟数据库中建表的方式很像??)

好了,然后创建一个ViewController,界面布局:

  在AppDelegate中声明三个属性用来管理CoreData对象,

#import <UIKit/UIKit.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;

@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext; //上下文对象
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
//数据模型对象
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;  //持久性存储区

- (void)saveContext;
- (NSURL *)applicationDocumentsDirectory;
    AppDelegate.m文件中自动生成了一系列方法,稍微改动下即可,主要做了四件事:

    1、初始化一个上下文对象;2、初始化一个数据模型类对象;3、初始化一个永久性存储区对象;4、获取应用文件路径;

    

//初始化一个上下文对象
- (NSManagedObjectContext *)managedObjectContext
{
    if (_managedObjectContext != nil) {
        return _managedObjectContext;
    }
    
    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil) {
        _managedObjectContext = [[NSManagedObjectContext alloc] init];
        [_managedObjectContext setPersistentStoreCoordinator:coordinator];
    }
    return _managedObjectContext;
}

//初始化一个数据模型类对象
- (NSManagedObjectModel *)managedObjectModel
{
    if (_managedObjectModel != nil) {
        return _managedObjectModel;
    }
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"CoreDataDemo" withExtension:@"momd"];
    _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    return _managedObjectModel;
}


//返回一个永久性存储区对象
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (_persistentStoreCoordinator != nil) {
        return _persistentStoreCoordinator;
    }
    
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"CoreDataDemo.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;
}

#pragma mark - Application's Documents director
//应用文件路径
- (NSURL *)applicationDocumentsDirectory
{
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}
    以上是完成基本的CoreData属性配置,完成后就可以实现CoreData的存储啦!

    首先,需要获取实体的对象数组。(里面存了多少篇日记。。。。)

   注意:设置检索哪种类型的实体对象的时候,这个@"Entity"名字必须与定义的实体名称一一对应!否则会找不到实体对象。

//获取实体对象数组
- (NSMutableArray*)getEntitiesArray;
{
    myDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
    //创建取回数据的请求
    NSFetchRequest * requset = [[NSFetchRequest alloc] init];
    //设置检索哪种类型的实体对象
    NSEntityDescription * entity = [NSEntityDescription entityForName:@"Entity" inManagedObjectContext:myDelegate.managedObjectContext];
    //设置请求实体
    [requset setEntity:entity];
    //指定对结果的排序方式
    NSSortDescriptor * sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"creationDate" ascending:YES];
    NSArray * sortDescriptions = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
    [requset setSortDescriptors:sortDescriptions];
    
    NSError * error = nil;
    //执行获取数据的请求 返回数组
    NSMutableArray * mutableArray  = [[myDelegate.managedObjectContext executeFetchRequest:requset error:&error] mutableCopy];
    if (!mutableArray) {
        NSLog(@"Error:%@,%@",error,[error userInfo]);
    }
    return mutableArray;
}

然后,依次完成增删改查的四个接口。。尼玛是不是所有的数据操作都这个套路。。。

增加日记:

- (IBAction)addContent:(id)sender {
    
    Entity * entity = (Entity*) [NSEntityDescription insertNewObjectForEntityForName:@"Entity" inManagedObjectContext:myDelegate.managedObjectContext];
    [entity setTitle:self.titleTextField.text];
    [entity setCreationDate:[NSDate date]];
    [entity setBody:self.contentTextField.text];
    [_entries addObject:entity];
    NSError * error;
    BOOL isSavaSuccess = [myDelegate.managedObjectContext save:&error];
    if (!isSavaSuccess) {
        NSLog(@"保存失败");
    }
    else{
        NSLog(@"保存成功");
    }
}

    修改日记:

//更新操作
- (IBAction)updateContent:(id)sender {
    Entity * entity = [_entries objectAtIndex:1];
    [self updateEntry:entity];
}
//更新操作
-(void)updateEntry:(Entity *)entry
{
    [entry setTitle:self.titleTextField.text];
    [entry setBody:self.contentTextField.text];
    [entry setCreationDate:[NSDate date]];
    NSError *error;
    BOOL isUpdateSuccess = [myDelegate.managedObjectContext save:&error];
    if (!isUpdateSuccess) {
        NSLog(@"Error:%@,%@",error,[error userInfo]);
    }
}


查询日记:

- (IBAction)queryContent:(id)sender {
    
    NSLog(@"The count of entry is %d",_entries.count);
    for (Entity * entry in _entries) {
        
        NSLog(@"标题:%@,  内容:%@, 日期:%@",entry.title,entry.body,entry.creationDate);
    }
}

删除日记:

- (IBAction)deleteContent:(id)sender {
    for (Entity * entry in _entries) {
        [self deleteEntry:entry];
    }
//删除操作
-(void)deleteEntry:(Entity *)entry
{
    [myDelegate.managedObjectContext deleteObject:entry];
    [self.entries removeObject:entry];
    NSError *error;
    if (![myDelegate.managedObjectContext save:&error]) {
        NSLog(@"Error:%@,%@",error,[error userInfo]);
    }
}
好了,基本效果粗来了,运行一下:

最后查询一下结果:

 2014-05-16 14:53:57.663 CoreDataDemo[6766:90b] 保存成功
2014-05-16 14:53:58.309 CoreDataDemo[6766:90b] The count of entry is 2
2014-05-16 14:53:58.310 CoreDataDemo[6766:90b] 标题:diyige ,  内容:zhe ge shi wo de di yi pian, 日期:2014-05-16 06:41:45 +0000
2014-05-16 14:53:58.311 CoreDataDemo[6766:90b] 标题:new dirarauy,  内容:xin de ri ji yo!!, 日期:2014-05-16 06:53:57 +0000


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值