苹果开发 笔记(87)coreData

1.报错的开始

今天练习coreData,在调试的时候老是报错,出现了
CoreData: error: Failed to call designated initializer on NSManagedObject class 报错的情况
下面是具体错误
2015-11-03 19:37:36.160 AdBook[3626:48979] CoreData: error: Failed to call designated initializer on NSManagedObject class ‘UserVoData’
2015-11-03 19:37:36.161 AdBook[3626:48979] -[UserVoData setUserName:]: unrecognized selector sent to instance

经查询了一下,发现了问题是我实体类继承了NSManagedObject 但私下调用了set的方法导致报错。

  UserVoData *vo = [[UserVoData alloc] init];
  vo.userName  = @"张三";//这一行就报错了

在《ios 开发指南》这本书里面有一个完整的coreData 的案例,提及到一些基础的设置和优化建议。coreData的对象映射 实际上是内部调用sqllite 操作,免去了sqllite的语法。

2. coreData几个步骤

插入数据的时候,需要获取到相应的实体,这个 NSEntityDescription 类就充当这个角色。

NSEntityDescription insertNewObjectForEntityForName:inManagedObjectContext
NSEntityDescription entityForName:inManagedObjectContext

1.插入的时候,使用带insert 关键字的。
NSManagedObject *obj = [NSEntityDescription insertNewObjectForEntityForName:@”User” inManagedObjectContext:managedObjectContext];

获取实体的话,使用entityForName 作为关键字。

2.需要删除 和获取查询 更新则需要使用NSFetchRequest 类实现请求设置。

 NSFetchRequest *request = [[NSFetchRequest alloc]init];
 request.entity = description;

3.创建流程

第一步 打开xcode 7 ,创建一个Project,选择single View Application,点击next
苹果开发 笔记(87)coreData_第1张图片


第二步,进入第二个界面 ,填写相应的项。如 product Name (产品名称),组织名,标识,选择的语言为Objective -c ,勾选User core Data,注意(若果不勾选则需要自己创建,勾选则会自动创建好一段代码。)
完成后,可以看到相应的文件已经创建起来。
苹果开发 笔记(87)coreData_第2张图片

第三步,进入到编辑区域,可以看到勾选了coreData 的选项会生成相应的 产品名.xcdatamodeld 的文件。点击进入去对其添加一个实体,实体需要改成大写名字。添加过程使用左下角【 Add Entity】 按钮添加。
添加完成后,添加相应的字段。
苹果开发 笔记(87)coreData_第3张图片

第四步 添加属性。分别为userName ,telPhone,addRess,info 均为String 字符串类型,属性的添加首字母不能为大写,这个和实体规则区别开来。
苹果开发 笔记(87)coreData_第4张图片

第五步创建一个类UserVoDataObject 继承NSManagedObject 类,用于绑定对应的实体。
苹果开发 笔记(87)coreData_第5张图片

第六步编写相应的相应的代码。

#import <CoreData/CoreData.h>

@interface UserVoDataObject : NSManagedObject

//用户名
@property (nonatomic,strong) NSString *userName;

//手机
@property (nonatomic,strong) NSString *telPhone;

//地址
@property (nonatomic,strong) NSString *addRess;

//介绍
@property (nonatomic,strong) NSString *info;


@en
#import "UserVoDataObject.h"

@implementation UserVoDataObject @dynamic userName;
@dynamic telPhone;
@dynamic addRess;
@dynamic info;


@end 

第六步绑定关联实体子类,再次点击xcdatamodeld 文件,选中其中的实体User,右边打开属性面板,在class 选项里面填写刚才创建的实体类。这样子一个类就关联起来了。
苹果开发 笔记(87)coreData_第6张图片

第七步 再次创建一个类 和 User 的实体一样,只继承NSObject类。

#import <Foundation/Foundation.h>

@interface UserVoData : NSObject

//用户名
@property (nonatomic,strong) NSString *userName;

//手机
@property (nonatomic,strong) NSString *telPhone;

//地址
@property (nonatomic,strong) NSString *addRess;

//介绍
@property (nonatomic,strong) NSString *info;

@end

#import "UserVoData.h"

@implementation UserVoData


@end

苹果开发 笔记(87)coreData_第7张图片

第八步编写插入删除获取的逻辑代码。

#import <Foundation/Foundation.h>
#import "UserVoData.h"

@interface DBManager : NSObject


+ (instancetype) shareManager;

//插入数据
- (BOOL) insertVo:(UserVoData *) vo;

//删除数据
- (BOOL) deleteVo:(UserVoData *) vo;

//获取所有数据
-(NSArray *) getAllDBData;



@end

实现该类。

//
// DBManager.m
// AdBook
//
// Created by xiashu on 15/11/3.
// Copyright © 2015年 xiashu. All rights reserved.
//

#import "DBManager.h"
#import "AppDelegate.h"
#import "UserVoData.h"
#import "UserVoDataObject.h"

@implementation DBManager


+ (instancetype) shareManager
{

    static DBManager *instance = nil;
    static dispatch_once_t once;

    dispatch_once(&once, ^{

        instance  = [[DBManager alloc]init];
    });

    return  instance;

}


//插入数据
- (BOOL) insertVo:(UserVoData *) vo
{

    AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
    //1.获取上下文
    NSManagedObjectContext *managedObjectContext =  delegate.managedObjectContext;

    //2.插入数据
    NSManagedObject *obj = [NSEntityDescription insertNewObjectForEntityForName:@"User" inManagedObjectContext:managedObjectContext];

    [obj setValue:vo.userName forKey:@"userName"];
    [obj setValue:vo.telPhone forKey:@"telPhone"];
    [obj setValue:vo.addRess forKey:@"addRess"];
    [obj setValue:vo.info forKey:@"info"];

    NSError *error = nil;

    if ([managedObjectContext save:&error])
    {
        return  YES;
    }

    return NO;
}

//删除数据
- (BOOL) deleteVo:(UserVoData *) vo
{

    AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
    //1.获取上下文
    NSManagedObjectContext *managedObjectContext =  delegate.managedObjectContext;

    //2.获取表
    NSEntityDescription *description  = [NSEntityDescription entityForName:@"User" inManagedObjectContext:managedObjectContext];

    //3.请求
    NSPredicate *predicate  = [NSPredicate predicateWithFormat:@"userName == %@",vo.userName];
    NSFetchRequest *request = [[NSFetchRequest alloc]init];
    request.entity = description;
    request.predicate = predicate;//过滤条件

    //4.执行调度
    NSError *error = nil;
    NSArray *listData  = [managedObjectContext executeFetchRequest:request error:&error];
    if ([listData count] >0)
    {

        for (NSManagedObject *obj in listData)
        {
            [managedObjectContext deleteObject:obj];
        }

        NSError *saveError = nil;
        if ([managedObjectContext save:&saveError])
        {
            return YES;
        }
    }

    return  NO;
}

//获取所有数据
-(NSArray *) getAllDBData
{
    NSMutableArray *array =[[NSMutableArray alloc]init];

    AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
    //1.获取上下文
    NSManagedObjectContext *managedObjectContext =  delegate.managedObjectContext;

    //2.获取表
    NSEntityDescription *description  = [NSEntityDescription entityForName:@"User" inManagedObjectContext:managedObjectContext];


    //3.请求
    NSFetchRequest *request = [[NSFetchRequest alloc]init];
    request.entity = description;


    //4.执行调度
    NSError *error = nil;
    NSArray *listData  = [managedObjectContext executeFetchRequest:request error:&error];
    if ([listData count] >0)
    {

        for (UserVoDataObject *curObj in listData)
        {

            UserVoData *vo = [[UserVoData alloc]init];
            vo.userName = curObj.userName;
            vo.telPhone = curObj.telPhone;
            vo.addRess = curObj.addRess;
            vo.info  = curObj.info;
            [array addObject:vo];
        }

    }

    return array;
}





@end

第九步 编写相应的UI对上面的类进行验证测试。

你可能感兴趣的:(苹果开发 笔记(87)coreData)