coredata

2018-04-24  本文已影响41人  liboxiang

简介

实现流程

Snip20180424_2.png

对象间相互关系

ManagedObjectModel、ManagedObjectContext、PersistentStoreCoordinator、NSManagedObject、NSPersistentContainer、NSEntityDescription


Snip20180424_1.png
// url 为CoreDataDemo.xcdatamodeld,注意扩展名为 momd,而不是 xcdatamodeld 类型
        NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"CoreDataDemo" withExtension:@"momd"];
        _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
[storeCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&error];
+ (id)insertNewObjectForEntityForName:(NSString *)entityName 
               inManagedObjectContext:(NSManagedObjectContext *)context

[NSEntityDescription insertNewObjectForEntityForName:@"TestEntity" inManagedObjectContext:_mainContext];
[_mainContext save:nil];

[_mainContext deleteObject:object];

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"TestEntity"];
    //查询条件
    NSPredicate *pre = [NSPredicate predicateWithFormat:@"uid = %@", @(3)];
    request.predicate = pre;
    NSBatchDeleteRequest *deleteRequest = [[NSBatchDeleteRequest alloc] initWithFetchRequest:request];
    [_mainContext executeRequest:deleteRequest error:nil];
delete rules
Snip20180507_3.png
  • Deny
    如果关系目标(员工)中至少有一个对象,则不要删除源对象(部门)。
    例如,如果您想要删除某个部门,则必须确保该部门中的所有员工都先转移到其他部门; 否则,该部门不能被删除。
  • Nullify(废止)
    删除对象之间的关系,但不要删除任何对象。
    这只有在员工的部门关系是可选的,或者确保在下一次保存操作之前为每个员工设置新部门时才有意义。
  • Cascade(级联)
    删除源时,删除关系目的地处的对象。
    例如,如果您删除某个部门,则同时启动该部门中的所有员工。
  • No Action(没有行动)
    对关系目的地的对象不做任何事情。
    例如,如果您删除了一个部门,即使他们仍然认为他们属于该部门,也会将所有员工保持原样。

改、查

查的时候配合NSExpression可以实现跟多效果,如查找最大最小值
NSFetchRequest

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"TestEntity"];
    //查询条件
    NSPredicate *pre = [NSPredicate predicateWithFormat:@"uid = %@", @(2)];
    request.predicate = pre;
     NSArray *resArray = [_mainContext executeFetchRequest:request error:nil];
    TestEntity *entity = resArray.lastObject;
    entity.name = @"lhm";
    [_mainContext save:nil];

或者NSBatchUpdateRequest
注:使用NSBatchUpdateRequest [context hasChanges]为NO,且使用NSBatchUpdateRequest后,_mainContext进行fetch不能获取到更新后的数据,要_mainContext refresh后才可以将修改更新到_mainContext。且在使用之前要_mainContext save一下,要不可能回造成conflict

NSBatchUpdateRequest *request = [[NSBatchUpdateRequest alloc] initWithEntityName:@"TestEntity"];
    request.predicate = [NSPredicate predicateWithFormat:@"uid == %@", @(3)];
 request.propertiesToUpdate = @{ @"uid" :[NSExpression expressionForConstantValue:@(YES)]};
   //request.propertiesToUpdate = @{
     //                              @"uid" : @(10)
       //                        };
    request.resultType = NSUpdatedObjectsCountResultType;
    NSBatchUpdateResult *res = (NSBatchUpdateResult *)[_mainContext executeRequest:request error:nil];
[[_mainContext refreshAllObjects]; //如果不刷新,获取值的时候可能会出错

异步查询NSAsynchronousFetchRequest

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"TestEntity"];
    //查询条件
    NSPredicate *pre = [NSPredicate predicateWithFormat:@"uid = %@", @(2)];
    request.predicate = pre;
    NSAsynchronousFetchRequest *requestAsy = [[NSAsynchronousFetchRequest alloc] initWithFetchRequest:request completionBlock:^(NSAsynchronousFetchResult * rsult) {
        NSLog(@"%@",rsult);
    }];
    [_mainContext executeRequest:requestAsy error:nil];

可以增删改NSSaveChangesRequest

NSSaveChangesRequest *saveChangeRequest = [[NSSaveChangesRequest alloc] initWithInsertedObjects:<#(nullable NSSet<NSManagedObject *> *)#> updatedObjects:<#(nullable NSSet<NSManagedObject *> *)#> deletedObjects:<#(nullable NSSet<NSManagedObject *> *)#> lockedObjects:<#(nullable NSSet<NSManagedObject *> *)#>];;
    [_mainContext executeRequest:saveChangeRequest error:nil];

取数据操作几种情况

写入数据

使用多线程的注意项

[subContext performBlockAndWait:^{
        [subContext save:nil];
    }];
[parentContext save:nil];
Snip20180508_2.png

处理大数据解决方案

- (void)performBackgroundTask:(void (^)(NSManagedObjectContext *))block;

性能优化注意点

NSFetchRequest *request =  [NSFetchRequest fetchRequestWithEntityName:@"Contact"];
 [request setRelationshipKeyPathsForPrefetching:@[ @"photo" ]];

版本管理和轻量级数据迁移

轻量级数据迁移则为core data自动处理

更复杂的数据迁移参考地址:https://www.objc.io/issues/4-core-data/core-data-migration/

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                             [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                             [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
    [storeCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error];

其他语法使用

NSManagedObjectContext

• Turn a single managed object back into a fault:
mergeChanges如果是NO,则object的修改将被抛弃;如果是YES,则从缓存或内存中取的object值之后,其修改将被重新应用到新取得的object上。
[context refreshObject:object mergeChanges:NO];
• Reset an entire context, clearing all its managed objects:
[context reset];

参考链接

https://www.objccn.io/issue-4-1/

上一篇 下一篇

猜你喜欢

热点阅读