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