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

来源:互联网 发布:mysql where 编辑:程序博客网 时间:2024/06/05 20:57

         近阶段想做一款针对自己的理财软件,全部实在本地操作,所以要用到数据库。原来一直都是用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 0
原创粉丝点击