增
步骤:
1.创建对象
2.赋值
3.保存
//1.创建对象
// 添加一个分类,快速创建对象,使用默认上下文
GEContactsObject *contactsObj = [GEContactsObject insertNewObjectInDefaultContext];
//2.赋值
[contactsObj.name](http://contactsObj.name) = self.nameTF.text;
contactsObj.namePinYin = [CommonTool getPinYinFromString:contactsObj.name].lowercaseString;
contactsObj.phone = self.phoneTF.text;
contactsObj.sectionNameKey = [contactsObj.namePinYin substringToIndex:1];
//3.保存
[[GECoreDataManager sharedInstance] saveContext];
删
步骤:
1.取出数据
2.删除数据
3.保存
// 1、取出数据
GEContactsObject *contactObj = [self.fetchedResultsController objectAtIndexPath:indexPath];
// 2、删除数据
//使用上下文删除对象 - 删除的是内存中的对象
[[GECoreDataManager sharedInstance].managedObjectContext deleteObject:contactObj];
// 3、保存上下文,把上下文中的对象状态持久化到磁盘
[[GECoreDataManager sharedInstance] saveContext];
改:
步骤:
1.取出数据
2.更新数据
3.保存
// 1、取出数据
GEContactsObject *contactsObj = [self.fetchedResultsController objectAtIndexPath:indexPath];
// 2、更新数据
self.[contactsObj.name](http://contactsObj.name) = self.nameTF.text;
self.contactsObj.namePinYin = [CommonTool getPinYinFromString:self.contactsObj.name].lowercaseString;// 张三 -> Zhang San zhangsan -> zhangsan
self.contactsObj.phone = self.phoneTF.text;
self.contactsObj.sectionNameKey = [self.contactsObj.namePinYin substringToIndex:1];
//3、保存
[[GECoreDataManager sharedInstance] saveContext];
查
步骤:
1.创建谓词 - 模糊查询
2.更新谓词
3.执行查询
//转小写
searchText = searchText.lowercaseString;
//判断有无文字
if (searchText.length) {
// 1、创建谓词 - 模糊查询
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"[self.name](http://self.name) CONTAINS %@ || self.namePinYin CONTAINS %@ || self.phone CONTAINS %@",searchText,searchText,searchText];
// 2、更新谓词
self.fetchedResultsController.fetchRequest.predicate = predicate;
}else{
//如果没有文字,清空谓词,把所有的查询出来
self.fetchedResultsController.fetchRequest.predicate = nil;
}
// 3、执行查询
[self.fetchedResultsController performFetch:nil];
一、创建工程
1、创建项目的时候勾选Use Core Data
CoreData
2、生成箭头所示文件
3、点击CoreData.xcdatamodeld,再点击加号创建一个Entity,改名为Person,点击右边Attributes的加号,增加两个记录属性,Person表创建完毕
生成4个文件两个类,一个是Person类,一个是Person分类
#import "Person+CoreDataProperties.h"
#import "AppDelegate.h"
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
//创建Person对象
AppDelegate *delegate = [UIApplication sharedApplication].delegate;
Person *p = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:delegate.managedObjectContext];
Person *p1 = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:delegate.managedObjectContext];
//赋值数据
p.name = @"zhangsan";
p.age = @(20);
//保存
[delegate saveContext];
}
手工实现CoreDataStack
创建工程
/**
* 快速获取app的documents目录url
*/
- (NSURL *)appDocumentsURL{
return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}
第一种方法:不打那个钩
当增加字段后,二那个类有很多代码,只改变分类
// CoreDataManager.h
// 手工实现CoreDataStack
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
@interface CoreDataManager : NSObject
///对象管理上下文
@property (nonatomic, strong) NSManagedObjectContext *managedObjectContext;
///对象管理模型
@property (nonatomic, strong) NSManagedObjectModel *managedObjectModel;
///存储调度器
@property (nonatomic, strong) NSPersistentStoreCoordinator *persistentStoreCoordinator;
/// 单例
+ (instancetype)sharedInstance;
/// 保存上下文
- (void)saveContext;
@end
// CoreDataManager.m
// 手工实现CoreDataStack
#import "CoreDataManager.h"
@implementation CoreDataManager
// 单例
+ (instancetype)sharedInstance {
static id instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[self alloc] init];
});
return instance;
}
/**
* 快速获取app的documents目录url
*/
- (NSURL *)appDocumentsURL{
return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}
#pragma mark - 懒加载
///对象管理上下文
- (NSManagedObjectContext *)managedObjectContext{
if (_managedObjectContext != nil) {
return _managedObjectContext;
}
//实例化
//ConcurrencyType: 多线程下的机制,并发类型,NSMainQueueConcurrencyType-在主队列里执行
_managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
//指定属于哪个存储调度器
[_managedObjectContext setPersistentStoreCoordinator:self.persistentStoreCoordinator];
return _managedObjectContext;
}
///对象管理模型
- (NSManagedObjectModel *)managedObjectModel{
if (_managedObjectModel != nil) {
return _managedObjectModel;
}
//实例化
//获得模型描述文件URL, 在xcode项目中 Model.xcdatamodeld 会被编译成Model.momd在.app的bundle里
// NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"];
// _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
//合并所有的.momd文件成一个managedObjectModel对象
//bundles为nil,从mainBundle合并
_managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil];
return _managedObjectModel;
}
///存储调度器
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator{
if (_persistentStoreCoordinator != nil) {
return _persistentStoreCoordinator;
}
//实例化 Model:指定对象管理模型
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel];
// 获取app的documents目录url
NSURL *documentsURL = [self appDocumentsURL];
// 拼接数据库路径
NSURL *fileURL = [documentsURL URLByAppendingPathComponent:@"myData.db"];
//添加存储器
/**
参数一:type:存储类型 数据库sqlite/xml/二进制/内存
NSSQLiteStoreType sqlite
NSXMLStoreType xml
NSBinaryStoreType 二进制
NSInMemoryStoreType 内存
参数二:configuration: 可以为空,使用默认配置
参数三:URL:数据库文件保存路径
参数四:options:选项可以为空 使用nil采用默认选项
*/
[_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:fileURL options:nil error:nil];
return _persistentStoreCoordinator;
}
/// 保存上下文
- (void)saveContext{
[self.managedObjectContext save:nil];
}
@end
// ViewController.m
// 手工实现CoreDataStack
/**
报错
1、coreData创建类时报错:
clang: error: linker command failed with exit code 1 (use -v to see invocation)
解决方法1:点击Model.xcdatamodeld->右边菜单栏最右边那个像回字的符号下面,把Codegen改成:Manual/None
解决方法2:在编译文件中,在TAGETS>Build Phases>Compile Sources中的coredataclass.m文件删除
2、“Swift Language Version” (SWIFT_VERSION) is required to be configured correctly for targets which use Swift. Use the [Edit > Convert > To Current Swift Syntax…] menu to choose a Swift version or use the Build Settings editor to configure the build setting directly.
点击Model.xcdatamodeld -> 右边:Code Generation:Language:选Objective-C
*/
#import "ViewController.h"
#import "Person+CoreDataProperties.h"
#import "CoreDataManager.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 打印沙盒路径
NSLog(@"%@",NSHomeDirectory());
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
//1.创建可被管理的对象 Name:要创建的对象的实体名
// ManagedObjectContext:创建出来的对象被哪个上下文管理
// NSEntityDescription :实体描述
Person *p = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:[CoreDataManager sharedInstance].managedObjectContext];
//2.赋值数据
p.name = @"suibain";
p.age = 30;
p.city = @"广州";
//3.使用上下文保存
[[CoreDataManager sharedInstance] saveContext];
NSLog(@"p = %@",p);
}
@end
增
//1.创建对象
// 添加一个分类,快速创建对象,使用默认上下文
GEContactsObject *contactsObj = [GEContactsObject insertNewObjectInDefaultContext];
//2.赋值
[contactsObj.name](http://contactsObj.name) = self.nameTF.text;
contactsObj.namePinYin = [CommonTool getPinYinFromString:contactsObj.name].lowercaseString;
contactsObj.phone = self.phoneTF.text;
contactsObj.sectionNameKey = [contactsObj.namePinYin substringToIndex:1];
//3.保存
[[GECoreDataManager sharedInstance] saveContext];
删
//删除数据
GEContactsObject *contactObj = [self.fetchedResultsController objectAtIndexPath:indexPath];
//使用上下文删除对象 - 删除的是内存中的对象
[[GECoreDataManager sharedInstance].managedObjectContext deleteObject:contactObj];
//保存上下文,把上下文中的对象状态持久化到磁盘
[[GECoreDataManager sharedInstance] saveContext];
改:
//更新数据
self.[contactsObj.name](http://contactsObj.name) = self.nameTF.text;
self.contactsObj.namePinYin = [CommonTool getPinYinFromString:self.contactsObj.name].lowercaseString;// 张三 -> Zhang San zhangsan -> zhangsan
self.contactsObj.phone = self.phoneTF.text;
self.contactsObj.sectionNameKey = [self.contactsObj.namePinYin substringToIndex:1];
//保存
[[GECoreDataManager sharedInstance] saveContext];
查
//转小写
searchText = searchText.lowercaseString;
//判断有无文字
if (searchText.length) {
// 创建谓词 - 模糊查询
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"[self.name](http://self.name) CONTAINS %@ || self.namePinYin CONTAINS %@ || self.phone CONTAINS %@",searchText,searchText,searchText];
//更新谓词
self.fetchedResultsController.fetchRequest.predicate = predicate;
}else{
//如果没有文字,清空谓词,把所有的查询出来
self.fetchedResultsController.fetchRequest.predicate = nil;
}
//执行查询
[self.fetchedResultsController performFetch:nil];