06-CoreData

步驟:
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];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末股耽,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子钳幅,更是在濱河造成了極大的恐慌物蝙,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件敢艰,死亡現(xiàn)場離奇詭異诬乞,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門震嫉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來森瘪,“玉大人,你說我怎么就攤上這事票堵《蟛牵” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵悴势,是天一觀的道長窗宇。 經(jīng)常有香客問我,道長瞳浦,這世上最難降的妖魔是什么担映? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮叫潦,結(jié)果婚禮上蝇完,老公的妹妹穿的比我還像新娘。我一直安慰自己矗蕊,他們只是感情好短蜕,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著傻咖,像睡著了一般朋魔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上卿操,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天警检,我揣著相機與錄音,去河邊找鬼害淤。 笑死扇雕,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的窥摄。 我是一名探鬼主播镶奉,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼崭放!你這毒婦竟也來了哨苛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤币砂,失蹤者是張志新(化名)和其女友劉穎建峭,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體决摧,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡亿蒸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年使碾,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片祝懂。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖拘鞋,靈堂內(nèi)的尸體忽然破棺而出砚蓬,到底是詐尸還是另有隱情,我是刑警寧澤盆色,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布灰蛙,位于F島的核電站,受9級特大地震影響隔躲,放射性物質(zhì)發(fā)生泄漏摩梧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一宣旱、第九天 我趴在偏房一處隱蔽的房頂上張望仅父。 院中可真熱鬧,春花似錦浑吟、人聲如沸笙纤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽省容。三九已至,卻和暖如春燎字,著一層夾襖步出監(jiān)牢的瞬間腥椒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工候衍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留笼蛛,地道東北人。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓脱柱,卻偏偏與公主長得像伐弹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子榨为,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容