• iOS数据持久化(三)


    #pragma mark - Core Data stack
    /**
     *  @synthesize 关联成员变量和属性
     */
    @synthesize managedObjectContext = _managedObjectContext;
    /**
     *
     */
    @synthesize managedObjectModel = _managedObjectModel;
    @synthesize persistentStoreCoordinator = _persistentStoreCoordinator;
    
    - (NSURL *)applicationDocumentsDirectory {
        // The directory the application uses to store the Core Data store file. This code uses a directory named "CD._8_25_CoreData" in the application's documents directory.
        return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
    }
    
    - (NSManagedObjectModel *)managedObjectModel {
        // The managed object model for the application. It is a fatal error for the application not to be able to find and load its model.
        if (_managedObjectModel != nil) {
            return _managedObjectModel;
        }
        //找到momd文件在bundle中的途径。
        NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"_8_25_CoreData" withExtension:@"momd"];
        _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
        return _managedObjectModel;
    }
    //重写get
    - (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
        // The persistent store coordinator for the application. This implementation creates and return a coordinator, having added the store for the application to it.
        if (_persistentStoreCoordinator != nil) {
            return _persistentStoreCoordinator;
        }
        
        // Create the coordinator and store
        //创建数据存储器的文件路径
        _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
        NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"_8_25_CoreData.sqlite"];
        NSError *error = nil;
        NSString *failureReason = @"There was an error creating or loading the application's saved data.";
        //coreData 不是对sqlite的封装,sqlite 只是其中一种存储方式
        //coredata的核心思想是:托管对象
        if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
            // Report any error we got.
            NSMutableDictionary *dict = [NSMutableDictionary dictionary];
            dict[NSLocalizedDescriptionKey] = @"Failed to initialize the application's saved data";
            dict[NSLocalizedFailureReasonErrorKey] = failureReason;
            dict[NSUnderlyingErrorKey] = error;
            error = [NSError errorWithDomain:@"YOUR_ERROR_DOMAIN" code:9999 userInfo:dict];
            // Replace this with code to handle the error appropriately.
            // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            //终止程序
            abort();
        }
        
        return _persistentStoreCoordinator;
    }
    
    
    - (NSManagedObjectContext *)managedObjectContext {
        // Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.)
        if (_managedObjectContext != nil) {
            return _managedObjectContext;
        }
        
        NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
        if (!coordinator) {
            return nil;
        }
        //设置上下文
        _managedObjectContext = [[NSManagedObjectContext alloc] init];
        [_managedObjectContext setPersistentStoreCoordinator:coordinator];
        return _managedObjectContext;
    }
    
    #pragma mark - Core Data Saving support
    
    - (void)saveContext {
        NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
        if (managedObjectContext != nil) {
            NSError *error = nil;
             //如果上下文有修改,并且保存失败
            if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
                // Replace this implementation with code to handle the error appropriately.
                // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
                NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
                abort();
            }
        }
    }
    

      

    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
    //    [self.tableView registerClass:[ UITableViewCell class] forCellReuseIdentifier:@"cell"];
        self.dataArray = [NSMutableArray arrayWithCapacity:0];
        AppDelegate *delegate = [UIApplication sharedApplication].delegate;
        NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Person"];
        //在上下文内通过条件获取响应数据
        NSArray *array = [delegate.managedObjectContext executeFetchRequest:request error:nil];
        [self.dataArray addObjectsFromArray:array];
        [self.tableView reloadData];
    }
    

      

    - (IBAction)addPerson:(UIButton *)sender {
        AppDelegate *delegate = [UIApplication sharedApplication].delegate;
        NSEntityDescription *entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:delegate.managedObjectContext];
        Person *per = [[Person alloc] initWithEntity:entity insertIntoManagedObjectContext:delegate.managedObjectContext];
        per.age = @(arc4random()%20 + 10);
        NSArray *array = @[@"萌萌",@"波波",@"jack",@"rose",@"静静",@"000"];
        per.name = array[arc4random() % (array.count)];
        
        [self.dataArray addObject:per];
        [self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:self.dataArray.count - 1 inSection:0]] withRowAnimation:UITableViewRowAnimationMiddle];
        
        [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:self.dataArray.count - 1 inSection:0] atScrollPosition:UITableViewScrollPositionBottom animated:YES];
    }
    

      

    - (IBAction)searchPerson:(UIButton *)sender {
        NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Person"];
        request.predicate = [NSPredicate predicateWithFormat:@"age>18"];
    
        AppDelegate *delegate = [UIApplication sharedApplication].delegate;
        NSArray *array = [delegate.managedObjectContext executeFetchRequest:request error:nil];
        
        [self.dataArray removeAllObjects];
        [self.dataArray addObjectsFromArray:array];
    }
    

      

    - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
        if (editingStyle == UITableViewCellEditingStyleDelete) {
            AppDelegate *delegate = [UIApplication sharedApplication].delegate;
            [delegate.managedObjectContext deleteObject:self.dataArray[indexPath.row]];
            [self.dataArray removeObjectAtIndex:indexPath.row];
            [tableView  deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationMiddle];
        }
    }
    

      

  • 相关阅读:
    vs中nodejs代码 resharper 提示 ECMAScript2015 Feature. your Current language level is ECMAScript5的解决办法
    port: ${SERVER_PORT:9190} #首先取环境变量,如果环境变量中没有,就取 9190 这个固定值
    SpringbBoot之JPA批量更新
    Linq To Object多字段组合唯一校验
    LINQ获取两个List的交集
    Linq实现分组后取最大(小)值
    Maven:浅析依赖(dependency)关系中 scope 的含义
    Source roots (or source folders) Test source roots (or test source folders; shown as rootTest)Resource rootsTest resource roots
    Parameter 0 of method sqlSessionTemplate in org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration required a single bean, but 2 were found:
    sping boot/cloud配置文件 on 读取为true
  • 原文地址:https://www.cnblogs.com/code-cd/p/4810397.html
Copyright © 2020-2023  润新知