CoreData用法一:增删改查(Demo讲解)

         近阶段想做一款针对自己的理财软件,全部实在本地操作,所以要用到数据库。原来一直都是用FMDB,直接用sql语句,后来看到CoreData挺牛逼的,所以我决定要用CoreData去写这个软件。由于对CoreData了解并不是很多,所以我会抽空闲时间,搞定CoreData.

        今天学习了CoreData的简单用法,增删改查。由于是一个Demo所以也没怎么进行封装,就迁就着看,再以后的几篇关于CoreData的blog里,我会深入学习,并且最终会用block对他进行封装,争取用起来写更少的代码量。 

        CoreData让不懂sql语句的人获益不少,因为他的操作基本是不用sql语句的。个人感觉效率比FMDM操作数据库高,而且还能直接生成实体类,省去了我们去一个文件一个文件的去建立model层的东西,用起来着实不错啊。下面看看他的简单用法吧。

      这个例子是一个单表的操作,表名:Student,字段有四个:studentnumber,name,age,gender.

首先,把我demo的整体文件架构介绍一下,如下:



下面看一下CoreDataManage文件,由于在文件中的代码里都已经有很明确的注释,所以在这不罗嗦太多:

<span style="font-size:14px;">//
//  CoreDataManage.h
//  CoreData
//
//  Created by junyuan ji on 14-5-25.
//  Copyright (c) 2014年 junyuan ji. All rights reserved.
//

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

@interface CoreDataManage : NSObject

+(NSManagedObjectContext *)GetManagedObjectContext;
@end</span>

//
//  CoreDataManage.m
//  CoreData
//
//  Created by junyuan ji on 14-5-25.
//  Copyright (c) 2014年 junyuan ji. All rights reserved.
//

#import "CoreDataManage.h"

@interface CoreDataManage()
+(NSManagedObjectModel *)Default;
+(NSPersistentStoreCoordinator *)GetPresistentStoreCoordinator;
@end

@implementation CoreDataManage

//创建管理对象模型
+(NSManagedObjectModel *)Default
{
    static NSManagedObjectModel * managedModel = nil;
    if (managedModel == nil)
    {
        //mergedModelFromBundles: 搜索工程中所有的.xcdatamodeld文件,并加载所有的实体到一个NSManagedObjectModel  实例中。这样托管对象模型知道所有当前工程中用到的托管对象的定义
        managedModel = [NSManagedObjectModel mergedModelFromBundles:nil];
    }
    return managedModel;
}

//创建持久化数据存储协调器
+(NSPersistentStoreCoordinator *)GetPresistentStoreCoordinator
{
    static NSPersistentStoreCoordinator * storeCoordinator = nil;
    if (storeCoordinator == nil)
    {
        storeCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self Default]];
        //创建数据库存储位置
        NSString * path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
        NSLog(@"path = %@========/n%@",path,NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES));
        NSString * filepath = [path stringByAppendingPathComponent:@"coredata.sqlite"];
        NSError * error = nil;
        [storeCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[NSURL fileURLWithPath:filepath] options:nil error:&error];
        NSLog(@"error = %@",error);
    }
    return storeCoordinator;
}

//创建托管对象上下文
//托管对象上下文类似于应用程序和数据存储之间的一块缓冲区。这块缓冲区包含所有未被写入数据存储的托管对象。你可以添加、删除、更改缓冲区内的托管对象。在很多时候,当你需要读、插入、删除对象时,你将会调用托管对象上下文的方法。
+(NSManagedObjectContext *)GetManagedObjectContext
{
    static NSManagedObjectContext * context = nil;
    if (context == nil)
    {
        context = [[NSManagedObjectContext alloc] init];
        [context setPersistentStoreCoordinator:[self GetPresistentStoreCoordinator]];
    }
    return context;
}
@end

运行后界面布局如下:


界面有点丑将就着看吧

下面是增删改查的操作代码:

<span style="font-size:14px;">//
//  RootViewController.m
//  CoreData
//
//  Created by junyuan ji on 14-5-25.
//  Copyright (c) 2014年 junyuan ji. All rights reserved.
//

#import "RootViewController.h"
#import <CoreData/CoreData.h>
#import "CoreDataManage.h"
#import "Student.h"

#define TABLE_NAME @"Student"

@interface RootViewController ()
@property (retain,nonatomic) IBOutlet UITextField * tf_studentnumber;
@property (retain,nonatomic) IBOutlet UITextField * tf_name;
@property (retain,nonatomic) IBOutlet UITextField * tf_age;
@property (retain,nonatomic) IBOutlet UITextField * tf_gender;
-(IBAction)add:(id)sender;
-(IBAction)delete:(id)sender;
-(IBAction)search:(id)sender;
-(IBAction)edit:(id)sender;
@end

@implementation RootViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
}
-(IBAction)add:(id)sender
{
    Student * stu = (Student *)[NSEntityDescription insertNewObjectForEntityForName:TABLE_NAME inManagedObjectContext:[CoreDataManage GetManagedObjectContext]];
    stu.studentnumber = [NSNumber numberWithInt:[self.tf_studentnumber.text intValue]];
    stu.name = self.tf_name.text;
    stu.age = [NSNumber numberWithInt:[self.tf_age.text intValue]];
    stu.gender=[NSNumber numberWithInt:[self.tf_gender.text intValue]];
    
    NSError * error = nil;
    if ([[CoreDataManage GetManagedObjectContext] save:&error])
    {
        self.tf_studentnumber.text = @"";
        self.tf_name.text = @"";
        self.tf_age.text = @"";
        self.tf_gender.text = @"";
    }
    else
    {
      NSLog(@"add entity error = %@",error);
    }
}

-(IBAction)delete:(id)sender
{
    NSArray * arr = [self searchResult];
    __block Student * deletemp ;
    [arr enumerateObjectsUsingBlock:^(Student * obj, NSUInteger idx, BOOL *stop) {
        if ([obj.studentnumber intValue] == [self.tf_studentnumber.text intValue])
        {
            deletemp = obj;
            *stop = YES;
        }
    }];
    if (deletemp)
    {
        [[CoreDataManage GetManagedObjectContext] deleteObject:deletemp];
        NSLog(@"====ok===delete");
    }
}

-(IBAction)search:(id)sender
{
    [self searchResult];
}

-(NSArray *)searchResult
{
    NSFetchRequest * request = [[NSFetchRequest alloc] init];
    NSEntityDescription * desption = [NSEntityDescription entityForName:TABLE_NAME inManagedObjectContext:[CoreDataManage GetManagedObjectContext]];
    [request setEntity:desption];
    
    NSError * error = nil;
    NSArray * result = [[CoreDataManage GetManagedObjectContext] executeFetchRequest:request error:&error];
    if (!error)
    {
        [result enumerateObjectsUsingBlock:^(Student * obj, NSUInteger idx, BOOL *stop) {
            NSLog(@"--%d,%@,%@,%@,%@--/n",idx,obj.studentnumber,obj.name,obj.age,obj.gender);
        }];
        
    }
    else
    {
        NSLog(@"error seach  = %@",error);
    }
    return result;
}

-(IBAction)edit:(id)sender
{
    NSArray * arr = [self searchResult];
    [arr enumerateObjectsUsingBlock:^(Student * obj, NSUInteger idx, BOOL *stop) {
        if ([obj.studentnumber intValue] == [self.tf_studentnumber.text intValue])
        {
            obj.name = self.tf_name.text;
            obj.gender = [NSNumber numberWithInt:[self.tf_gender.text intValue]];
            obj.age = [NSNumber numberWithInt:[self.tf_age.text intValue]];
            
            NSError * error = nil;
            if ([[CoreDataManage GetManagedObjectContext] save:&error])
            {
                ;
            }
            else
            {
                NSLog(@"error=====%@",error);
            }
            *stop = YES;
        }
    }];
}


-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self.tf_studentnumber resignFirstResponder];
    [self.tf_name resignFirstResponder];
    [self.tf_gender resignFirstResponder];
    [self.tf_age resignFirstResponder];
}

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

@end</span><span style="font-size:18px;">
</span>

增删改查的代码就是上面这些了,以后有时间了再去封装,在写blog,今天到这了。



源码下载




  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值