CoreData的使用

之前看關(guān)于CoreData的使用都w是很早之前的昭殉,對于現(xiàn)在有些不太適用胧谈,在網(wǎng)上各種查找和總結(jié)之后物赶,寫了這篇文章橡庞,有興趣的朋友可以看看较坛。

1.創(chuàng)建工程的時(shí)候選擇CoreData(不建議)

CoreData

創(chuàng)建工程的是選擇了CoreData,創(chuàng)建完工程之后毙死,系統(tǒng)會自動(dòng)生成該文件



你也可以通過添加文件達(dá)到同樣的效果



選中文件燎潮,往里面添加你想要添加的模型,并對屬性進(jìn)行設(shè)置
(ps:Entity首字母必須大寫扼倘,屬性類型也需要規(guī)范設(shè)置)

創(chuàng)建實(shí)體模型



每個(gè)模型對應(yīng)四個(gè)文件

2.創(chuàng)建你的Manager類-繼承自NSObject

.h文件
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

@interface MyCoreManager : NSObject

/**管理對象, 上下文, 持久性存儲模型對象*/
@property (nonatomic, strong) NSManagedObjectContext *managedObjectContext;

/**單例*/
+ (instancetype)shareInstanceWithStoreName:(NSString *)storeName;

/** 查找 數(shù)據(jù)*/
- (NSMutableArray *)findByModel:(id)model predicateString: (NSString *)predicateString;

/** 插入 數(shù)據(jù) */
- (BOOL)insertModel:(id)model;

/** 刪除 數(shù)據(jù) */
- (BOOL)removeModel:(id)model predicateString: (NSString *)predicateString;

/** 修改 數(shù)據(jù) */
- (BOOL)changeModel:(id)model predicateString: (NSString *)predicateString;
@end

.m文件
#import "MyCoreManager.h"
#import <CoreData/CoreData.h>
#import <objc/runtime.h>

#define Class_NAME(CName) NSStringFromClass([CName class])

@interface MyCoreManager ()
/**被管理的數(shù)據(jù)模型, 數(shù)據(jù)結(jié)構(gòu)*/
@property (nonatomic, strong) NSManagedObjectModel *managedObjectModel;

/**連接數(shù)據(jù)庫的*/
@property (nonatomic, strong) NSPersistentStoreCoordinator *persistentStoreCoordinator;

/**數(shù)據(jù)庫名*/
@property (nonatomic, strong) NSString *storeName;

@end
static MyCoreManager *coreData;

@implementation MyCoreManager

- (NSManagedObjectContext *)managedObjectContext
{
    if (!_managedObjectContext) {
        
        NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
        
        if (coordinator) {
            _managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
            [_managedObjectContext setPersistentStoreCoordinator:coordinator];
        }
    }
    return _managedObjectContext;
}


//  managedObjectModel 懶加載
- (NSManagedObjectModel *)managedObjectModel
{
    if (!_managedObjectModel) {
        
        NSURL *modelURL = [[NSBundle mainBundle] URLForResource:_storeName withExtension:@"momd"];
        _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    }
    return _managedObjectModel;
}


//  persistentStoreCoordinator 懶加載
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (!_persistentStoreCoordinator) {
        
        NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:[NSString stringWithFormat:@"%@.sqlite", _storeName]];
        NSLog(@"---\nstoreURL: %@",storeURL);
        NSError *error = nil;
        _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
        
        if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
            abort();
        }
    }
    return _persistentStoreCoordinator;
}


// Returns the URL to the application's Documents directory.獲取Documents路徑
- (NSURL *)applicationDocumentsDirectory
{
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}


#pragma mark - Methods

//  查
- (NSArray *)findByModel:(id)model predicateString: (NSString *)predicateString
{
    NSError *error = nil;
    NSArray *listArray = [_managedObjectContext executeFetchRequest:[self fetchRequest:Class_NAME(model) predicate:predicateString] error:&error];
    
    NSMutableArray *resultArray = [[NSMutableArray alloc] initWithArray:listArray];;
    //
    //    if (listArray.count >= 1)
    //    {
    //
    //        for (NSManagedObject *manager in listArray)
    //        {
    //
    //            for (NSString *propertyName in [self ClassAttributes:model] )
    //            {
    //                [manager setValue:[model valueForKey:propertyName] forKey:propertyName];
    //            }
    //            [resultArray addObject:model];
    //        }
    //    }
    return resultArray;
}


//  插入 數(shù)據(jù)
- (BOOL)insertModel:(id)model
{
    NSManagedObject *manager = [NSEntityDescription insertNewObjectForEntityForName:Class_NAME(model) inManagedObjectContext:_managedObjectContext];
    
    for (NSString *propertyName in [self ClassAttributes:model]) {
        [manager setValue:[model valueForKey:propertyName] forKey:propertyName];
    }
    
    BOOL result = [self saveContext];
    return result;
    
    
}


//  刪除 數(shù)據(jù)
- (BOOL)removeModel:(id)model predicateString: (NSString *)predicateString
{
    NSError * error = nil;
    NSArray * listArray = [_managedObjectContext executeFetchRequest:[self fetchRequest:Class_NAME(model) predicate:predicateString] error:&error];
    
    if (listArray.count > 0) {
        for (NSManagedObject *manager in listArray) {
            
            [_managedObjectContext deleteObject:manager];
        }
    }
    return [self saveContext];
}


//  改
- (BOOL)changeModel:(id)model predicateString: (NSString *)predicateString
{
    NSError * error = nil;
    NSArray * listArray = [_managedObjectContext executeFetchRequest:[self fetchRequest:Class_NAME(model) predicate:predicateString] error:&error];
    
    if (listArray.count > 0) {
        
        for (NSManagedObject * manager in listArray) {
            for (NSString * propertyName in [self ClassAttributes:model]) {
                [manager setValue:[model valueForKey:propertyName] forKey:propertyName];
            }
        }
    }
    return [self saveContext];
}


//  讀取數(shù)據(jù)請求 ( 連接 請求 )
- (NSFetchRequest *)fetchRequest:(NSString *)entityName predicate:(NSString *)predicateString
{
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:[NSEntityDescription entityForName:entityName inManagedObjectContext:_managedObjectContext]];
    
    if (predicateString != nil) {
        
        NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateString];
        
        [request setPredicate:predicate];
    }
    return request;
}


#pragma mark - allAttributes
- (NSMutableArray *)ClassAttributes:(id)classModel
{
    NSMutableArray *array = [NSMutableArray array];
    NSString *className = Class_NAME(classModel);
    const char *cClassName = [className UTF8String];
    
    id classM = objc_getClass(cClassName);
    unsigned int outCount, i;
    objc_property_t * properties = class_copyPropertyList(classM, &outCount);
    for (i = 0; i < outCount; i++) {
        objc_property_t property = properties[i];
        NSString * attributeName = [NSString stringWithUTF8String:property_getName(property)];
        
        [array addObject:attributeName];
    }
    return array;
}


#pragma mark - save
- (BOOL)saveContext
{
    NSManagedObjectContext *context = [self managedObjectContext];
    
    if (context) {
        
        NSError *error = nil;
        if ([context hasChanges] && ![context save:&error]) {
            abort();
            return NO;
        }
    }
    return YES;
}

//  單例
+ (instancetype)shareInstanceWithStoreName:(NSString *)storeName
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        coreData = [[self alloc] init];
        coreData.storeName = storeName;
    });
    return coreData;
}


@end

3.調(diào)用

1.引入模型文件确封,和你創(chuàng)建的模型名字相同的那個(gè)
2.引入你的管理類

增
    MyCoreManager * coreData = [MyCoreManager shareInstanceWithStoreName:@"MyData"];
    Student * stu = [[Student alloc]initWithEntity:[NSEntityDescription entityForName:@"Student" inManagedObjectContext:coreData.managedObjectContext] insertIntoManagedObjectContext:nil];
    stu.name = @"alex";
    stu.age = @"12";
    [coreData insertModel:stu];
查
    MyCoreManager * coreData = [MyCoreManager shareInstanceWithStoreName:@"MyData"];
    Student * stu = [[Student alloc]initWithEntity:[NSEntityDescription entityForName:@"Student" inManagedObjectContext:coreData.managedObjectContext] insertIntoManagedObjectContext:nil];
    
    NSMutableArray * StuArr = [coreData findByModel:stu predicateString:@"name = 12 AND age = 12"];
    
    for (Student * stuModel in StuArr) {
        MyModel * model = [[MyModel alloc]init];
        model.name = stuModel.name;
        model.age = stuModel.age;
        [_datas addObject: model];
    }

//刪
- (BOOL)removeModel:(id)model predicateString: (NSString *)predicateString
//改
- (BOOL)changeModel:(id)model predicateString: (NSString *)predicateString

三點(diǎn)要注意:
(1) shareInstanceWithStoreName:@"MyData"]中的MyData是你所創(chuàng)建的model文件名
(2) 對象初始化不能簡單的alloc init ,需要按上面代碼的歌聲進(jìn)行初始化,否則調(diào)用對象就會導(dǎo)致程序崩潰
(3)謂詞(predicateString)的使用再菊,不懂的同學(xué)可以戳這里http://www.reibang.com/p/3da75e023b9c

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末爪喘,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子纠拔,更是在濱河造成了極大的恐慌秉剑,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稠诲,死亡現(xiàn)場離奇詭異侦鹏,居然都是意外死亡诡曙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門略水,熙熙樓的掌柜王于貴愁眉苦臉地迎上來价卤,“玉大人,你說我怎么就攤上這事渊涝∩麒担” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵跨释,是天一觀的道長胸私。 經(jīng)常有香客問我,道長鳖谈,這世上最難降的妖魔是什么岁疼? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮蚯姆,結(jié)果婚禮上五续,老公的妹妹穿的比我還像新娘洒敏。我一直安慰自己龄恋,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布凶伙。 她就那樣靜靜地躺著郭毕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪函荣。 梳的紋絲不亂的頭發(fā)上显押,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機(jī)與錄音傻挂,去河邊找鬼乘碑。 笑死,一個(gè)胖子當(dāng)著我的面吹牛金拒,可吹牛的內(nèi)容都是我干的兽肤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼绪抛,長吁一口氣:“原來是場噩夢啊……” “哼资铡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起幢码,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤笤休,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后症副,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體店雅,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡政基,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了闹啦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腋么。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖亥揖,靈堂內(nèi)的尸體忽然破棺而出珊擂,到底是詐尸還是另有隱情,我是刑警寧澤费变,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布摧扇,位于F島的核電站,受9級特大地震影響挚歧,放射性物質(zhì)發(fā)生泄漏扛稽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一滑负、第九天 我趴在偏房一處隱蔽的房頂上張望在张。 院中可真熱鬧,春花似錦矮慕、人聲如沸帮匾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瘟斜。三九已至,卻和暖如春痪寻,著一層夾襖步出監(jiān)牢的瞬間螺句,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工橡类, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蛇尚,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓顾画,卻偏偏與公主長得像取劫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子亲雪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

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