数据持久化方案四----CoreData

2019-03-06  本文已影响0人  雨_田

一、首先创建一个coreData 模型文件
(如:CoreDataTestModel.xcdatamodeld)


0.png

二、创建Model(实体):XLTestModel
XLTestModel.h

@interface XLTestModel : NSObject
@property (nonatomic, copy) NSString *school;
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSInteger age;
@property (nonatomic, copy) NSString *recordId;
@end

XLTestModel.m

@implementation XLTestModel

@end

三、创建Entity(实例):(XLTestEntity)

(一)、图示


1.png 2.png

(二)四个文件:
1、配置Entity的属性


image.png

2、要设置CoreData的Tool Version:(建议手动可以,随时查看定位)
<1>手动生成管理,2个分类(CoreDataProperties、CoreDataClass)
在Xcode7及以前时代,手动管理,生成2个分类4个文件
XLTestEntity+CoreDataProperties.h

#import "XLTestEntity+CoreDataClass.h"

@interface XLTestEntity (CoreDataProperties)

+ (NSFetchRequest<XLTestEntity *> *)fetchRequest;

@property (nullable, nonatomic, copy) NSString *school;
@property (nullable, nonatomic, copy) NSString *name;
@property (nonatomic) int64_t age;
@property (nullable, nonatomic, copy) NSString *recordId;
@property (nullable, nonatomic, copy) NSString *mySelfID;

@end

XLTestEntity+CoreDataClass.m

@implementation XLTestEntity (CoreDataProperties)

+ (NSFetchRequest<XLTestEntity *> *)fetchRequest {
    return [NSFetchRequest fetchRequestWithEntityName:@"XLTestEntity"];
}

@dynamic school;
@dynamic name;
@dynamic age;
@dynamic recordId;
@dynamic mySelfID;

@end

XLTestEntity+CoreDataClass.h

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

@interface XLTestEntity : NSManagedObject

@end

#import "XLTestEntity+CoreDataProperties.h"

XLTestEntity+CoreDataClass.m

#import "XLTestEntity+CoreDataClass.h"

@implementation XLTestEntity

@end
<2>自动生成管理,在Xcode8及以后版本,封禁掉自动生成代码,自动管理。 image.png

<3>设置语言,swift(默认),选择objective-c,需要手动修改

四、创建CoreData管理类(CoreDataManager)
CoreDataManager.h

#import <Foundation/Foundation.h>

#import <CoreData/CoreData.h>


//实体model
#import "XLTestModel.h"

//实例class
#import "XLTestEntity+CoreDataClass.h"
#import "XLTestEntity+CoreDataClass.h"

NS_ASSUME_NONNULL_BEGIN

@interface CoreDataManager : NSObject

/*1.
 NSManagedObjectContext(被管理的数据上下文)
 操作实际内容(操作持久层)
 作用:插入数据,查询数据,删除数据
 */
@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;

/*2.
 NSManagedObjectModel(被管理的数据模型)
 数据库所有表格或数据结构,包含各实体的定义信息
 作用:添加实体的属性,建立属性之间的关系
 操作方法:视图编辑器,或代码
 */
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;

/*3.
 NSPersistentStoreCoordinator(持久化存储助理)
 相当于数据库的连接器
 作用:设置数据存储的名字,位置,存储方式,和存储时机
 */
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;

/*
 (4)NSManagedObject(被管理的数据记录)
     相当于数据库中的表格记录

 (5)NSFetchRequest(获取数据的请求)
     相当于查询语句

 (6)NSEntityDescription(实体结构)
     相当于表格结构

 (7)后缀为.xcdatamodeld的包
     里面是.xcdatamodel文件,用数据模型编辑器编辑
     编译后为.momd或.mom文件
 */


+ (CoreDataManager*)shareCoreDataManager;

- (void)insertModelWithMySelfID:(NSString *)mySelfID WithModel:(XLTestModel *)model;//增
- (NSArray *)getDataWithMySelfID:(NSString *)mySelfID;//查
- (void)updateModelWithMySelfID:(NSString *)mySelfID WithModel:(XLTestModel *)model;//改
- (void)deletModelWithMySelfID:(NSString *)mySelfID WithModel:(XLTestModel *)model;//删一个
- (void)deleteAllModelWithMySelfID:(NSString *)mySelfID;//删所有

@end

NS_ASSUME_NONNULL_END

CoreDataManager.m

#import "CoreDataManager.h"

@implementation CoreDataManager

@synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;

+ (CoreDataManager *)shareCoreDataManager {
    static CoreDataManager *coreDataManager;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        coreDataManager = [[CoreDataManager alloc] init];
    });
    return coreDataManager;
}

- (void)saveContext {
    NSError *error = nil;
    NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
    if (managedObjectContext != nil) {
        if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        }
    }
}
#pragma mark - Core Data stack
- (NSManagedObjectContext *)managedObjectContext {
    if (_managedObjectContext != nil) {
        return _managedObjectContext;
    }

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

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

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

    if (_persistentStoreCoordinator != nil) {
        return _persistentStoreCoordinator;
    }
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"xiaoliCoreData.sqlite"];

    NSError *error = nil;

    /*
     *配置支持 低版本数据库向高版本数据库迁移
     NSMigratePersistentStoresAutomaticallyOption设置为YES,CoreData会试着把低版本的持久化存储区迁移到最新版本的模型文件。
     NSInferMappingModelAutomaticallyOption设置为YES,CoreData会试着以最为合理地方式自动推断出源模型文件的实体中,某个属性到底对应于目标模型文件实体中的哪一个属性。
     */
    //设置版本迁移方案
    NSDictionary *options = @{NSMigratePersistentStoresAutomaticallyOption:@(YES),NSInferMappingModelAutomaticallyOption:@(YES)};
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    // 创建持久化存储协调器,并将迁移方案的字典当做参数传入
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) {

    
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    return _persistentStoreCoordinator;
}

// 返回应用程序 存储目录的URL
- (NSURL *)applicationDocumentsDirectory {
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}


- (void)insertModelWithMySelfID:(NSString *)mySelfID WithModel:(XLTestModel *)model {//增

    NSManagedObjectContext *context = [self managedObjectContext];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"XLTestEntity"];
    //谓词---过滤(表名+关系名)
    fetchRequest.predicate = [NSPredicate predicateWithFormat:@"(mySelfID == %@ and name == %@)",mySelfID ,model.recordId];
    NSError *error;
    NSInteger count =  [context countForFetchRequest:fetchRequest error:&error];
    if (count < 1) {
        XLTestEntity *myCollect = [NSEntityDescription insertNewObjectForEntityForName:@"XLTestEntity" inManagedObjectContext:context];
        myCollect.mySelfID = mySelfID;
        myCollect.school = model.school;
        myCollect.name = model.name;
        myCollect.age = model.age;
        myCollect.recordId = model.recordId;
        NSError *error;
        if (![context save:&error]) {
            NSLog(@"保存失败:%@",error);
        }
    }  
}
- (NSArray *)getDataWithMySelfID:(NSString *)mySelfID {//查
    NSMutableArray *myCollects = [[NSMutableArray alloc] init];
    NSManagedObjectContext *context = [self managedObjectContext];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"XLTestEntity"];
    fetchRequest.predicate = [NSPredicate predicateWithFormat:@"(mySelfID == %@)",mySelfID];
    NSError *error;

    NSArray *fetchRequestObjects = [context executeFetchRequest:fetchRequest error:&error];
    for (XLTestEntity *myCollect in fetchRequestObjects) {
        XLTestModel *model = [XLTestModel new];
        model.school = myCollect.school;
        model.name = myCollect.name;
        model.age = myCollect.age;
        model.recordId = myCollect.recordId;
        [myCollects addObject:model];
    }
    return myCollects;
}
- (void)updateModelWithMySelfID:(NSString *)mySelfID WithModel:(XLTestModel *)model{//改
    NSManagedObjectContext *context = [self managedObjectContext];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"XLTestEntity"];
    fetchRequest.predicate = [NSPredicate predicateWithFormat:@"(mySelfID == %@ and recordId == %@)",mySelfID ,model.recordId];
    NSError *error;
    NSArray *fetchRequestObjects = [context executeFetchRequest:fetchRequest error:&error];
    if (!error) {
        if (fetchRequestObjects.count == 1) {
            XLTestEntity *myCollect = fetchRequestObjects[0];
            myCollect.school = model.school;
            myCollect.name = model.name;
            myCollect.age = model.age;
        
        }
    }
    if ([context hasChanges]) {
        if (![context save:&error]) {
            NSLog(@"更改失败:%@",error);
        }
    }

 }

- (void)deletModelWithMySelfID:(NSString *)mySelfID WithModel:(XLTestModel *)model {//删一个
    NSManagedObjectContext *context = [self managedObjectContext];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"XLTestEntity"];
    fetchRequest.predicate = [NSPredicate predicateWithFormat:@"(mySelfID == %@ and recordId == %@)",mySelfID ,model.recordId];
    NSError *error;
    NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
    if (!error) {
        for (XLTestEntity *myCollect in fetchedObjects) {
            [context deleteObject:myCollect];
        }
    }
    if ([context hasChanges]) {
        if (![context save:&error]) {
            NSLog(@"删除失败:%@",error);
        }
    }

}
- (void)deleteAllModelWithMySelfID:(NSString *)mySelfID; {//删所有

    NSManagedObjectContext *context = [self managedObjectContext];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"XLTestEntity"];
    fetchRequest.predicate = [NSPredicate predicateWithFormat:@"(mySelfID == %@)",mySelfID];
    NSError *error;
    NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
    if (!error) {
        for (XLTestEntity *myCollect in fetchedObjects) {
            [context deleteObject:myCollect];
        }
    }
    if ([context hasChanges]) {
        if (![context save:&error]) {
            NSLog(@"删除失败:%@",error);
        }
    }

}

@end

五、具体实现

//增

for (NSInteger i=0; i<4; i++) {
    XLTestModel *model = [XLTestModel new];
    model.name = [NSString stringWithFormat:@"张%ld", i];
    model.school = @"第一中学";
    model.age = 20+i;
    model.recordId = [NSString stringWithFormat:@"record_%ld", i+1000];
    [[CoreDataManager shareCoreDataManager] insertModelWithMySelfID:@"xiaoli" WithModel:model];
}

//查

NSArray *arr0 = [[CoreDataManager shareCoreDataManager] getDataWithMySelfID:@"xiaoli"];
NSLog(@"%@", arr0);

//改

XLTestModel *model1 = [XLTestModel new];
model1.name = @"王二";
model1.school = @"第-中学";
model1.age = 30;
model1.recordId = @"record_1000";
[[CoreDataManager shareCoreDataManager] updateModelWithMySelfID:@"xiaoli" WithModel:model1];
NSArray *arr1 = [[CoreDataManager shareCoreDataManager] getDataWithMySelfID:@"xiaoli"];
NSLog(@"%@", arr1);

//删一个

XLTestModel *model2 = [XLTestModel new];
model2.recordId = @"record_1003";
[[CoreDataManager shareCoreDataManager] deletModelWithMySelfID:@"xiaoli" WithModel:model2];
NSArray *arr2 = [[CoreDataManager shareCoreDataManager] getDataWithMySelfID:@"xiaoli"];
NSLog(@"%@", arr2);

//删所有

[[CoreDataManager shareCoreDataManager] deleteAllModelWithMySelfID:@"xiaoli"];
NSArray *arr3 = [[CoreDataManager shareCoreDataManager] getDataWithMySelfID:@"xiaoli"];
NSLog(@"%@", arr3);
上一篇下一篇

猜你喜欢

热点阅读