iOS CoreData (二)数据库升级

君子生非异也,善假于物也。 ---先秦·荀子《劝学》

本文是基于iOS CoreData (一) 增删改查及其Demo之上进行数据库的升级。因为在实际开发中有且肯定会有模型属性的修改,所以本文在此进行补充下,同时感谢且行且珍惜_iOS分享经验。

1.首先下载CoreDataLearn.
2.点击datamodel文件Editor添加模型版本,文件名以AddHobby为例

  • iOS CoreData (二)数据库升级_第1张图片
    AddVersion.png

    3.将Model Version中的Current选择为AddHobby即可

  • iOS CoreData (二)数据库升级_第2张图片
    ModelVersion.png

    4.在新增的AddHobby中添加属性

  • iOS CoreData (二)数据库升级_第3张图片
    AddAttributes.png

    5.添加映射文件Mapping Model

  • iOS CoreData (二)数据库升级_第4张图片
    添加映射模型.png

    啰嗦下。。。选择SourceDataModel和TargetDataModel

  • iOS CoreData (二)数据库升级_第5张图片
    SourceDataModel.png
  • iOS CoreData (二)数据库升级_第6张图片
    TargetDataModel.png

    7.删除并重新创建NSManagedObject模型类

  • iOS CoreData (二)数据库升级_第7张图片
    重新生成模型文件.png

    8.更新数据连接器配置,插入数据时添加新属性信息并展示

  • iOS CoreData (二)数据库升级_第8张图片
    更新数据连接器配置.png
//创建数据库
- (void)createSqlite{
    
    //1、创建模型对象
    //获取模型路径
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"];
    //根据模型文件创建模型对象
    NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    
    
    //2、创建持久化存储助理:数据库
    //利用模型对象创建助理对象
    NSPersistentStoreCoordinator *store = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
    
    //数据库的名称和路径
    NSString *docStr = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *sqlPath = [docStr stringByAppendingPathComponent:@"coreData.sqlite"];
    NSLog(@"数据库 path = %@", sqlPath);
    NSURL *sqlUrl = [NSURL fileURLWithPath:sqlPath];
    
    NSError *error = nil;
    //设置数据库相关信息 添加一个持久化存储库并设置类型和路径,NSSQLiteStoreType:SQLite作为存储库
    //[store addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:sqlUrl options:nil error:&error];
    [store addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:sqlUrl options:@{NSMigratePersistentStoresAutomaticallyOption : @YES} error:&error];
    
    if (error) {
        NSLog(@"添加数据库失败:%@",error);
    } else {
        NSLog(@"添加数据库成功");
    }
    
    //3、创建上下文 保存信息 操作数据库
    
    NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
    
    //关联持久化助理
    context.persistentStoreCoordinator = store;
    
    _context = context;
    
    
}
//插入数据
- (void)insertData{
    
    
    // 1.根据Entity名称和NSManagedObjectContext获取一个新的继承于NSManagedObject的子类Student
    
    Student * student = [NSEntityDescription
                         insertNewObjectForEntityForName:@"Student"
                         inManagedObjectContext:_context];
    
    //  2.根据表Student中的键值,给NSManagedObject对象赋值
    student.name = [NSString stringWithFormat:@"Mr-%d",arc4random()%100];
    student.age = arc4random()%20;
    student.sex = arc4random()%2 == 0 ?  @"美女" : @"帅哥" ;
    student.height = arc4random()%180;
    student.number = arc4random()%100;
    student.hobby = @"basketball";
    
    //查询所有数据的请求
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Student"];
    NSArray *resArray = [_context executeFetchRequest:request error:nil];
    _dataSource = [NSMutableArray arrayWithArray:resArray];
    [self.tableView reloadData];
    
    //   3.保存插入的数据
    NSError *error = nil;
    if ([_context save:&error]) {
        [self alertViewWithMessage:@"数据插入到数据库成功"];
    }else{
        [self alertViewWithMessage:[NSString stringWithFormat:@"数据插入到数据库失败, %@",error]];
    }
    
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    
    UITableViewCell * celll = [tableView dequeueReusableCellWithIdentifier:@"cellID" forIndexPath:indexPath];
    
    Student * student = _dataSource[indexPath.row];
    ;
    celll.imageView.image = [UIImage imageNamed:([student.sex isEqualToString:@"美女"] == YES ? @"mei.jpeg" : @"luo.jpg")];
    celll.textLabel.text = [NSString stringWithFormat:@" age = %d \n number = %d \n name = %@ \n sex = %@ \n hobby = %@",student.age, student.number, student.name, student.sex, student.hobby];
    celll.textLabel.numberOfLines = 0;
    
    return celll;
}
//给个高度 完全展示下数据
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 120;
}

9.最后附上加上新属性之后的效果

  • iOS CoreData (二)数据库升级_第9张图片
    Simulator Screen Shot - iPhone 8 Plus - 2018-01-22 at 00.18.06.png

    10.大功告成,睡觉

你可能感兴趣的:(iOS CoreData (二)数据库升级)