CoreData

原创 2015年11月20日 20:07:43

新建项目,
soga
如果忘了勾选use Core Data, 想在中途使用Core Data, 则可以自己写一个单例, 代码如下(这些, 可以新建一个工程, 从AppDelegate中复制粘贴):
CoreDataManager.h

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

@interface CoreDataManager : NSObject

+ (CoreDataManager *)defaults;

//  数据管理器类
@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
//  模型管理器类
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
//  连接器
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;

- (void)saveContext;
- (NSURL *)applicationDocumentsDirectory;

@end

CoreDataManager.m

#import "CoreDataManager.h"

@implementation CoreDataManager

+ (CoreDataManager *)defaults {
    static CoreDataManager *manager;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        manager = [[CoreDataManager alloc] init];
    });

    return manager;
}

#pragma mark - Core Data stack

@synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;

- (NSURL *)applicationDocumentsDirectory {
    // The directory the application uses to store the Core Data store file. This code uses a directory named "ligen.CoreData_52" in the application's documents directory.
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}

- (NSManagedObjectModel *)managedObjectModel {
    // The managed object model for the application. It is a fatal error for the application not to be able to find and load its model.
    if (_managedObjectModel != nil) {
        return _managedObjectModel;
    }
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"CoreData_52" withExtension:@"momd"];
    _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    return _managedObjectModel;
}

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
    // The persistent store coordinator for the application. This implementation creates and returns a coordinator, having added the store for the application to it.
    if (_persistentStoreCoordinator != nil) {
        return _persistentStoreCoordinator;
    }

    // Create the coordinator and store

    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"CoreData_52.sqlite"];
    NSError *error = nil;
    NSString *failureReason = @"There was an error creating or loading the application's saved data.";

    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
        // Report any error we got.
        NSMutableDictionary *dict = [NSMutableDictionary dictionary];
        dict[NSLocalizedDescriptionKey] = @"Failed to initialize the application's saved data";
        dict[NSLocalizedFailureReasonErrorKey] = failureReason;
        dict[NSUnderlyingErrorKey] = error;
        error = [NSError errorWithDomain:@"YOUR_ERROR_DOMAIN" code:9999 userInfo:dict];
        // Replace this with code to handle the error appropriately.
        // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    return _persistentStoreCoordinator;
}


- (NSManagedObjectContext *)managedObjectContext {
    // Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.)
    if (_managedObjectContext != nil) {
        return _managedObjectContext;
    }

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (!coordinator) {
        return nil;
    }
    _managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
    [_managedObjectContext setPersistentStoreCoordinator:coordinator];
    return _managedObjectContext;
}

#pragma mark - Core Data Saving support

- (void)saveContext {
    NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
    if (managedObjectContext != nil) {
        NSError *error = nil;
        if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
            // Replace this implementation with code to handle the error appropriately.
            // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        }
    }
}



@end

在storyboard中拖四个按钮:
soga
在ViewController.m:

#import "ViewController.h"
#import "CoreDataManager.h"
#import "Student.h"

@interface ViewController ()
@property(nonatomic, strong)CoreDataManager *manager;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    self.view.backgroundColor = [UIColor whiteColor];

    self.manager = [CoreDataManager defaults];

    NSLog(@"url =====   %@", [self.manager applicationDocumentsDirectory]);


}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (IBAction)add:(UIButton *)sender {
    //  创建实体描述
    //  参数1: 描述的实体
    //  参数2: 数据管理器
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Student" inManagedObjectContext:[self.manager managedObjectContext]];

    //  创建实体
    //  参数1: 实体描述
    //  参数2: 数据管理器
    Student *stu = [[Student alloc] initWithEntity:entity insertIntoManagedObjectContext:self.manager.managedObjectContext];
    stu.name = @"成精";
    stu.age = @1000;
    stu.sex = @"?";
    stu.hobby = @"fdsa";
    stu.number = @10;

    [self.manager saveContext];
}

//  查找
- (IBAction)select:(UIButton *)sender {

    //  获取查询数据的请求, 相当于数据库的查询语句
    NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Student"];

    //  添加约束    谓词
//    NSPredicate *predicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"%@ == %@", @"name", @"%@"], @"成精"];

    NSPredicate *predicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"%@ == %@", @"name", @"%@"], @"成精"];

    request.predicate = predicate;

    //  通过某个key给数组排序
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];

    [request setSortDescriptors:[NSArray arrayWithObjects:sortDescriptor, nil]];


     NSError *error;

    NSArray *array = [self.manager.managedObjectContext executeFetchRequest:request error:&error];

    NSLog(@"%ld", array.count);


}

//  修改
- (IBAction)update:(UIButton *)sender {

    //  获取查询数据的请求, 相当于数据库的查询语句
    NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Student"];

    //  添加约束    谓词
    //    NSPredicate *predicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"%@ == %@", @"name", @"%@"], @"成精"];

    NSPredicate *predicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"%@ == %@", @"name", @"%@"], @"成精"];

    request.predicate = predicate;

    //  通过某个key给数组排序
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];

    [request setSortDescriptors:[NSArray arrayWithObjects:sortDescriptor, nil]];


    NSError *error;

    NSArray *array = [self.manager.managedObjectContext executeFetchRequest:request error:&error];

    Student *stu = [array lastObject];
    stu.sex = @"女";

    [self.manager saveContext];

}

//  删除
- (IBAction)delete:(UIButton *)sender {

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Student" inManagedObjectContext:self.manager.managedObjectContext];
    [fetchRequest setEntity:entity];
    // Specify criteria for filtering which objects to fetch
    NSPredicate *predicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"%@ == %@", @"sex", @"%@"], @"?"];
    [fetchRequest setPredicate:predicate];
    // Specify how the fetched objects should be sorted
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"sex" ascending:YES];
    [fetchRequest setSortDescriptors:[NSArray arrayWithObjects:sortDescriptor, nil]];

    NSError *error = nil;
    NSArray *array = [self.manager.managedObjectContext executeFetchRequest:fetchRequest error:&error];

    for (Student *stu in array) {

        [self.manager.managedObjectContext deleteObject:stu];
    }

    [self.manager saveContext];


}
@end

如果建立工程时勾选了Core Data, 会自带一个 .xcDataxcdatamodelld, 里面添加实体的属性, 若想在后来添加新的属性, 想要新建一个 .xcDataxcdatamodelld, command + N,soga
原本建立的.xcDataxcdatamodelld
这里写图片描述
在添加两条属性:
这里写图片描述
增加新属性后需要一个Mapping Model:
这里写图片描述
这里写图片描述

添加实体属性后, 需要建立
这里写图片描述
会自动根据实体属性生成四个文件:
这里写图片描述
增加属性后, 还需要添加:
如图

版权声明:本文为博主原创文章,未经博主允许不得转载。

iOS 数据库篇(二) CoreData创建与使用

在上一篇博客iOS 数据库篇(一) CoreData 认识与入门—原理讲解篇,我们了解CoreData是什么,CoreData 的原理,结构以及它的优缺点.这篇文章,我们将会学习 CoreData 的...
  • wanna_dance
  • wanna_dance
  • 2017年06月21日 18:05
  • 757

CoreData 从入门到精通 (一) 数据模型 + CoreData 栈的创建

概述CoreData 是 Cocoa 平台上用来管理模型层数据和数据持久化的一个框架,说简单点,就是一个数据库存储框架。CoreData 里相关的概念比较多,而且初始化也非常繁琐,所以对初学者的学习还...
  • chaoyang805
  • chaoyang805
  • 2016年12月03日 18:09
  • 5951

iOS CoreData查询结果排序

通过coredata存入的数据的主键是Z_PK,但是我们不能使用这个主键进行排序,这个是coredata自用的。 我们需要自己加一些字段用于排序,比如createtime。...
  • worldzhy
  • worldzhy
  • 2015年11月09日 15:59
  • 1725

iOS CoreData详解(五)多线程

原创blog,转载请注明出处 blog.csdn.net/hello_hwc 欢迎关注我的iOS SDK详解专栏,这里有很多基础的文章 http://blog.csdn.net/column/d...
  • Hello_Hwc
  • Hello_Hwc
  • 2015年06月01日 09:09
  • 4035

iOS Coredata安全之多线程

今天去一家公司面试,被问到coredata是怎么处理
  • xiaowenwen1010
  • xiaowenwen1010
  • 2014年09月25日 00:25
  • 1696

CoreData用法三: NSPredicate在CoreData中的使用

NSPredicate在CoreData中常用作查询使用,相当于sql语句中的where查询子句。 最常用的方法为: NSPredicate *ca = [NSPredicate predicateW...
  • jijunyuan_11109
  • jijunyuan_11109
  • 2014年05月29日 14:22
  • 1996

Coredata的版本升级

在开发的后期,可能因为完善和修复功能,需要对Coredata数据库表进行修改,这样就需要对CoreData进行版本升级。 比如你修改了DB字段以后,用户在旧版本上升级为新版本时会crash. 因为升级...
  • mjx342112780
  • mjx342112780
  • 2016年08月27日 10:55
  • 5017

CoreData-基本数据操作(增删改查)

所有操作都基于Core Data框架相关 API,工程需要添加CoreData.framework支持 1.增  NSEntityDescription insertNewObjectForEnti...
  • ivolcano
  • ivolcano
  • 2017年01月09日 19:39
  • 687

iOS CoreData详解(四)Faulting and Uniquing

原创blog,转载请注明出处 blog.csdn.net/hello_hwc 欢迎关注我的iOS SDK详解专栏 http://blog.csdn.net/column/details/hua...
  • Hello_Hwc
  • Hello_Hwc
  • 2015年05月26日 11:11
  • 2553

iOS 使用CoreData处理大量数据

在CoreData中想要更新大量数据,我们往往要将大量修改后的 NSManagedObject 加载到 NSManagedObjectContext 中并保存,这会占用大量内存,如果超过了系统限制,那...
  • youshaoduo
  • youshaoduo
  • 2016年12月16日 17:27
  • 5537
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CoreData
举报原因:
原因补充:

(最多只允许输入30个字)