君子生非异也,善假于物也。 ---先秦·荀子《劝学》
本文是基于iOS CoreData (一) 增删改查及其Demo之上进行数据库的升级。因为在实际开发中有且肯定会有模型属性的修改,所以本文在此进行补充下,同时感谢且行且珍惜_iOS分享经验。
1.首先下载CoreDataLearn.
2.点击datamodel文件Editor添加模型版本,文件名以AddHobby为例
-
AddVersion.png
3.将Model Version中的Current选择为AddHobby即可
-
ModelVersion.png
4.在新增的AddHobby中添加属性
-
AddAttributes.png
5.添加映射文件Mapping Model
-
添加映射模型.png
啰嗦下。。。选择SourceDataModel和TargetDataModel
- SourceDataModel.png
-
TargetDataModel.png
7.删除并重新创建NSManagedObject模型类
-
重新生成模型文件.png
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.最后附上加上新属性之后的效果
-
Simulator Screen Shot - iPhone 8 Plus - 2018-01-22 at 00.18.06.png
10.大功告成,睡觉💤
网友评论