增
步驟:
1.創(chuàng)建對象
2.賦值
3.保存
//1.創(chuàng)建對象
// 添加一個分類朋贬,快速創(chuàng)建對象,使用默認上下文
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.取出數(shù)據(jù)
2.刪除數(shù)據(jù)
3.保存
// 1、取出數(shù)據(jù)
GEContactsObject *contactObj = [self.fetchedResultsController objectAtIndexPath:indexPath];
// 2窜骄、刪除數(shù)據(jù)
//使用上下文刪除對象 - 刪除的是內(nèi)存中的對象
[[GECoreDataManager sharedInstance].managedObjectContext deleteObject:contactObj];
// 3锦募、保存上下文,把上下文中的對象狀態(tài)持久化到磁盤
[[GECoreDataManager sharedInstance] saveContext];
改:
步驟:
1.取出數(shù)據(jù)
2.更新數(shù)據(jù)
3.保存
// 1、取出數(shù)據(jù)
GEContactsObject *contactsObj = [self.fetchedResultsController objectAtIndexPath:indexPath];
// 2邻遏、更新數(shù)據(jù)
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.創(chuàng)建謂詞 - 模糊查詢
2.更新謂詞
3.執(zhí)行查詢
//轉(zhuǎn)小寫
searchText = searchText.lowercaseString;
//判斷有無文字
if (searchText.length) {
// 1、創(chuàng)建謂詞 - 模糊查詢
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赎线、執(zhí)行查詢
[self.fetchedResultsController performFetch:nil];
一、創(chuàng)建工程
1糊饱、創(chuàng)建項目的時候勾選Use Core Data
CoreData
2垂寥、生成箭頭所示文件
3、點擊CoreData.xcdatamodeld另锋,再點擊加號創(chuàng)建一個Entity滞项,改名為Person,點擊右邊Attributes的加號夭坪,增加兩個記錄屬性文判,Person表創(chuàng)建完畢
生成4個文件兩個類,一個是Person類台舱,一個是Person分類
#import "Person+CoreDataProperties.h"
#import "AppDelegate.h"
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
//創(chuàng)建Person對象
AppDelegate *delegate = [UIApplication sharedApplication].delegate;
Person *p = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:delegate.managedObjectContext];
Person *p1 = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:delegate.managedObjectContext];
//賦值數(shù)據(jù)
p.name = @"zhangsan";
p.age = @(20);
//保存
[delegate saveContext];
}
手工實現(xiàn)CoreDataStack
創(chuàng)建工程
/**
* 快速獲取app的documents目錄url
*/
- (NSURL *)appDocumentsURL{
return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}
第一種方法:不打那個鉤
當增加字段后律杠,二那個類有很多代碼,只改變分類
// CoreDataManager.h
// 手工實現(xiàn)CoreDataStack
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
@interface CoreDataManager : NSObject
///對象管理上下文
@property (nonatomic, strong) NSManagedObjectContext *managedObjectContext;
///對象管理模型
@property (nonatomic, strong) NSManagedObjectModel *managedObjectModel;
///存儲調(diào)度器
@property (nonatomic, strong) NSPersistentStoreCoordinator *persistentStoreCoordinator;
/// 單例
+ (instancetype)sharedInstance;
/// 保存上下文
- (void)saveContext;
@end
// CoreDataManager.m
// 手工實現(xiàn)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: 多線程下的機制竞惋,并發(fā)類型柜去,NSMainQueueConcurrencyType-在主隊列里執(zhí)行
_managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
//指定屬于哪個存儲調(diào)度器
[_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;
}
///存儲調(diào)度器
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator{
if (_persistentStoreCoordinator != nil) {
return _persistentStoreCoordinator;
}
//實例化 Model:指定對象管理模型
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel];
// 獲取app的documents目錄url
NSURL *documentsURL = [self appDocumentsURL];
// 拼接數(shù)據(jù)庫路徑
NSURL *fileURL = [documentsURL URLByAppendingPathComponent:@"myData.db"];
//添加存儲器
/**
參數(shù)一:type:存儲類型 數(shù)據(jù)庫sqlite/xml/二進制/內(nèi)存
NSSQLiteStoreType sqlite
NSXMLStoreType xml
NSBinaryStoreType 二進制
NSInMemoryStoreType 內(nèi)存
參數(shù)二:configuration: 可以為空,使用默認配置
參數(shù)三:URL:數(shù)據(jù)庫文件保存路徑
參數(shù)四:options:選項可以為空 使用nil采用默認選項
*/
[_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:fileURL options:nil error:nil];
return _persistentStoreCoordinator;
}
/// 保存上下文
- (void)saveContext{
[self.managedObjectContext save:nil];
}
@end
// ViewController.m
// 手工實現(xiàn)CoreDataStack
/**
報錯
1、coreData創(chuàng)建類時報錯:
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.創(chuàng)建可被管理的對象 Name:要創(chuàng)建的對象的實體名
// ManagedObjectContext:創(chuàng)建出來的對象被哪個上下文管理
// NSEntityDescription :實體描述
Person *p = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:[CoreDataManager sharedInstance].managedObjectContext];
//2.賦值數(shù)據(jù)
p.name = @"suibain";
p.age = 30;
p.city = @"廣州";
//3.使用上下文保存
[[CoreDataManager sharedInstance] saveContext];
NSLog(@"p = %@",p);
}
@end
增
//1.創(chuàng)建對象
// 添加一個分類浑厚,快速創(chuàng)建對象,使用默認上下文
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];
刪
//刪除數(shù)據(jù)
GEContactsObject *contactObj = [self.fetchedResultsController objectAtIndexPath:indexPath];
//使用上下文刪除對象 - 刪除的是內(nèi)存中的對象
[[GECoreDataManager sharedInstance].managedObjectContext deleteObject:contactObj];
//保存上下文,把上下文中的對象狀態(tài)持久化到磁盤
[[GECoreDataManager sharedInstance] saveContext];
改:
//更新數(shù)據(jù)
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];
查
//轉(zhuǎn)小寫
searchText = searchText.lowercaseString;
//判斷有無文字
if (searchText.length) {
// 創(chuàng)建謂詞 - 模糊查詢
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;
}
//執(zhí)行查詢
[self.fetchedResultsController performFetch:nil];