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
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值