Core Data使用

注意:每次修改CoreData的Attribute时记得把应用给删除重装,要不会崩,因为建立的数据库文件还在该目录下,里面的字段没有更改,所以不能匹配就会崩溃,切忌,要不就每次进来把文件先删除,再建立,不过貌似这样做用户的数据就会丢失,所以还是每次删除应用再装吧。??

1.先建立一个coredata的工程,把Use Core Data勾上

进去后的AppDelegate.m中有如下代码:

#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 "com.pupuwang.XWClient.CoreDataDemo" 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:@"CoreDataDemo" withExtension:@"momd"];
    _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    return _managedObjectModel;
}
//持久化存储协调器
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
    // The persistent store coordinator for the application. This implementation creates and return 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:@"CoreDataDemo.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] init];
    [_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();
        }
    }
}

自己手动建立起来coredata文件,也可以自己手动写

2.建立实体

选中xcdatamodeld后缀文件,按下面步骤操作:

选中xcdatamodeld后缀文件,点击导航栏Editor->Create NSManagedObject Subclass 一路next,建立模型对象User.h User.m

其中生成的model:User里面的属性用的是@dynamic

@property有两个对应的词,一个是@synthesize,一个是@dynamic。如果@synthesize和@dynamic都没写,那么默认的就是@syntheszie var = _var;

@synthesize的语义是如果你没有手动实现setter方法和getter方法,那么编译器会自动为你加上这两个方法。

@dynamic告诉编译器,属性的setter与getter方法由用户自己实现,不自动生成。(当然对于readonly的属性只需提供getter即可)。假如一个属性被声明为@dynamic var,然后你没有提供@setter方法和@getter方法,编译的时候没问题,但是当程序运行到instance.var =someVar,由于缺setter方法会导致程序崩溃;或者当运行到 someVar = var时,由于缺getter方法同样会导致崩溃。编译时没问题,运行时才执行相应的方法,这就是所谓的动态绑定。

3.APPDelegate.m中

_window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
View1Controller *view1 = [[View1Controller alloc]init];
view1.myAppdelegate = self;
_window.rootViewController = view1;
[_window makeKeyAndVisible];

4.View1Controller.h中

#import <UIKit/UIKit.h>
#import <CoreData/CoreData.h>
#import "AppDelegate.h"
#import "User.h"

@interface View1Controller : UIViewController
@property (nonatomic,strong) AppDelegate *myAppdelegate;//创建该视图的记得把值传过来
@end

5.View1Controller.m中

#import "View1Controller.h"

@interface View1Controller ()<UITextFieldDelegate>
@property (weak, nonatomic) IBOutlet UITextField *nameTF;
@property (weak, nonatomic) IBOutlet UITextField *ageTF;
@property (weak, nonatomic) IBOutlet UITextField *sexTF;
@property (weak, nonatomic) IBOutlet UITextView *serchContent;

@end

@implementation View1Controller

- (void)viewDidLoad {
    [super viewDidLoad];

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

#pragma mark - Click
//保存数据
- (IBAction)saveData:(id)sender {
    User *user = (User *)[NSEntityDescription insertNewObjectForEntityForName:@"User" inManagedObjectContext:self.myAppdelegate.managedObjectContext];
    [user setName:self.nameTF.text];
    [user setAge:@([self.ageTF.text integerValue])];
    [user setSex:self.sexTF.text];
    [user setBirth:[NSDate dateWithTimeIntervalSinceNow:100000]];
    [self saveStatus];
}//查询数据
- (IBAction)serchData:(id)sender {
    NSFetchRequest *request = [[NSFetchRequest alloc]init];
    NSEntityDescription *user = [NSEntityDescription entityForName:@"User" inManagedObjectContext:self.myAppdelegate.managedObjectContext];
    [request setEntity:user];
    NSError *error;
    NSArray *mutablefetchResult = [self.myAppdelegate.managedObjectContext executeFetchRequest:request error:&error];
    if (mutablefetchResult == nil) {
        NSLog(@"Seach fail");
    }
    NSLog(@"coredata entity count is %ld",[mutablefetchResult count]);
    NSMutableString *string = [[NSMutableString alloc]init];
    for (User *user in mutablefetchResult) {
        [string appendFormat:@"name = %@,age = %@,sex = %@,birthDay = %@",user.name,user.age,user.sex,user.birth];
        [string appendFormat:@"\n"];
    }
    self.serchContent.text = string;
}
//更新数据
- (IBAction)updateData:(id)sender {
    NSFetchRequest *request  =[[NSFetchRequest alloc]init];
    NSEntityDescription *user = [NSEntityDescription entityForName:@"User" inManagedObjectContext:self.myAppdelegate.managedObjectContext];
    [request setEntity:user];
    NSError *error;
    //设置查询条件 NSPredicate (谓词):查询语句
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name = %@",self.nameTF.text];
    [request setPredicate:predicate];

    NSArray *mutabelFetchResult = [self.myAppdelegate.managedObjectContext executeFetchRequest:request error:&error];
    if (mutabelFetchResult == nil) {
        NSLog(@"seach fail");
    }
    NSLog(@"coredata entity count is %ld",mutabelFetchResult.count);
    for (User *user in mutabelFetchResult) {
        [user setAge:@([self.ageTF.text integerValue])];
    }
    [self saveStatus];
}//删除数据
- (IBAction)cancelData:(id)sender {
    NSFetchRequest *request = [[NSFetchRequest alloc]init];
    NSEntityDescription *user = [NSEntityDescription entityForName:@"User" inManagedObjectContext:self.myAppdelegate.managedObjectContext];
    [request setEntity:user];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name = %@",self.nameTF.text];
    [request setPredicate:predicate];

    NSError *error;
    NSArray *mutableFetchResult = [self.myAppdelegate.managedObjectContext executeFetchRequest:request error:&error];
    if (mutableFetchResult == nil) {
        NSLog(@"search fail");
    }
    NSLog(@"coredata entity count is %ld",mutableFetchResult.count);

    for (User *user in mutableFetchResult) {
        [self.myAppdelegate.managedObjectContext deleteObject:user];
    }
    [self saveStatus];
}
//数据是否保存成功
- (void)saveStatus{
    NSError *error;
    BOOL isSuccess = [self.myAppdelegate.managedObjectContext save:&error];
    if (!isSuccess) {
        NSLog(@"save fail");
    }else{
        NSLog(@"save success");
    }
}

-(BOOL)textFieldShouldReturn:(UITextField *)textField{
    [textField resignFirstResponder];
    return YES;

}
时间: 2024-11-07 12:48:18

Core Data使用的相关文章

Core Data

简介 Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象.在此数据操作期间,我们不需要编写任何SQL语句,这个有点类似于著名的Hibernate持久化框架,不过功能肯定是没有Hibernate强大的.简单地用下图描述下它的作用: 左边是关系模型,即数据库,数据库里面有张person表,person表里面有id.name.age三个字段,而且有2条记录: 右

我为什么用 SQLite 和 FMDB 而不用 Core Data

转:http://segmentfault.com/a/1190000000363392 编者注:文章的"我"是指原作者. 凭良心讲,我不能告诉你不去使用Core Data.它不错,而且也在变好,并且它被很多其他Cocoa开发者所理解,当有新人加入你的组或者需要别人接手你的项目的时候,这点很重要.更重要的是,不值得花时间和精力去写自己的系统去代替它.真的,使用Core Data吧. 为什么我不使用Core Data Mike Ash写到: 就我自己而言,我不是个狂热粉丝.我发现API是

Core Data存储自定义类型数据

目录: 一.使用CoreData存储基本数据 二.使用CoreData存储自定义类型数据 简单介绍CoreData CoreData是iOS编程中使用持久化数据存储的一种方式,我们知道CoreData并不是数据库本身,而是Apple提供的对象持久化技术--Object Persistent technology.CoreData框架为我们的数据变更.管理.对象存储.读取和恢复提供了支持.下面我们来尝试创建一个简单的CoreData Project. 操作 1. 打开x-code,为你的proje

Core Data使用之一(Swift): 保存

Core Data 用于永久化数据,它是基于SQLite数据库的保存一门技术. 那么,在Swift中,它是如何实现的呢? 首先,需要新建一个模板,打开工程中的xcdatamodeld文件,点击“Add Entity” ,这时候,就创建的一个模板.之后,可以修改模板的名称为自己想要的名称.然后,在Attributes里面,点击“+”,添加字段并修改类型. 然后,在代码里面 “import CoreData”.接着,用NSManagedObject来保存对象,它可以转换成任何对象.它的类型是字典.

Chapter 23 Core Data

1.  Core Data is only able to store certain data types in its store, and UIImage is not one of these types. Instead, you declared the UIImage as transformable. With a transformable attribute, Core Data will convert the object into NSData when saving,

Core Data浅谈系列之十 : 关于数据模型中实体的属性

之前写了<Core Data浅谈系列汇总>,今天稍微回顾了下,做些补充. 在这个系列的第一篇<基础结构>中(2013年1月份的文章,时间过得好快啊!),有简单带过Entity的Attribute: 数据类型.布尔值统一用NSNumber来表示: 字符串类型用NSString表示: 时间类型用NSDate表示: 二进制数据类型用NSData表示: 非标准类型用Transformable来表示: 而Attribute还有其自身的Properties,比如Transient表示不用持久化

iOS Core data多线程并发访问的问题

大家都知道Core data本身并不是一个并发安全的架构:不过针对多线程访问带来的问题,Apple给出了很多指导:同时很多第三方的开发者也贡献了很多解决方法.不过最近碰到的一个问题很奇怪,觉得有一定的特殊性,与大家分享一下. 这个问题似乎在7.0.1以前的版本上并不存在:不过后来我升级版本到了7.0.4.app的模型很简单,主线程在前台对数据库进行读写,而后台线程不断地做扫描(只读).为此每个线程中各创建了一个NSManagedObjectContext. 这个模型其实有点奇怪,因为普遍的模型是

iOS开发学习之Core Data

1.添加DataModel文件 2.添加实体和属性 3.创建NSManagedObject的子类,这里命名为Location(若没有实体属性类型是Transformable或没有额外的方法,只需要存储基本类型的话,可略过) 注意:这里可以做一个额外的工作,在Location+CoreDataProperties.h文件中,将实体属性类型是Transformable对应的@property属性的类型从id改为需要的类型 4.在AppDelegate.m文件添加以下代码: @interface Ap

Core Data-备用

Core Data是一个功能强大的层,位于SQLite数据库之上,它避免了SQL的复杂性,能让我们以更自然的方式与数据库进行交互.Core Data将数据库行转换为OC对象(托管对象)来实现,这样无需任何SQL知识就能操作他们. Core Data位于MVC设计模式中的模型层,一般需要在设备上存储结构化数据时,考虑使用SQLite或是序列化等方法,而Core Data是这两种方法的混合体,并增加了一些功能,提供了SQL强大威力,但是用起来又和序列化一样简单.Core Data能将应用程序中的对象

UIKit,Core Data , Core Graphics, Core Animation,和OpenGLES框架

iOS的主要框架介绍 框架是一个目录,这个目录包含了共享库,访问共享库里代码的头文件,和其它的图片和声音的资源文件.一个共享库定义的方法或函数可以被应用程序调用. IOS提供了很多你可以在应用程序里调用的框架.要使用一个框架,需要将它添加到你的项目中,你的项目才可以使用它.许多应用程序都使用了如Foundation.UIKit.和Core Graphics这些框架.根据你为应用程序选择的模版,相关的框架就已经被自动引入了.如果默认加入的框架不能满足你的应用程序的需求,你也可以加入需要的框架. 看