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