关于IOS开发这块儿,苹果公司从前几年的全球开发者大会中一直在强调CoreData数据持久化这一块儿。使用coreData可以节省你50%到70%的代码量来管理数据库,你可以不用懂sql语句就可以很方便的通过数据NSManagerObjectContext上下文来通过协调器来管理数据库里面的数据,这里面的数据增加,删除,修改和查询全部交给协调器来管理这些数据。
CoreData的原理我大概说一下
//初始化 托管对象上下文
// context 代码和 CoreData 的中间件
//-----NSManagedObjectContext ---》》增删改查
// |----------|
// 代码 协调器
// / \
// 概念模型 物理存储
//初始化持久化存储位置
// __Model __xxx.Sqlite
// 协调器,CoreData中 概念模型 和 物理存储的中间件
下面就是我的一个小Demo代码片段,供大家学习和参考
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
//获取 数据模型
static NSManagedObjectModel * model()
{
static NSManagedObjectModel * model;
if (model!=nil) {
return model;
}
//1.初始化 数据模型
model = [[NSManagedObjectModel alloc]init];
//2.初始化 实体对象
NSEntityDescription * personEn = [[NSEntityDescription alloc]init];
//2.1设置实体对象的名称
[personEn setName:@"Person"];
//2.2设置实体对象对应的类名称
[personEn setManagedObjectClassName:@"Person"];
//3.初始化 name,age属性
NSAttributeDescription * nameDesc = [[NSAttributeDescription alloc]init];
//3.1设置属性名
[nameDesc setName:@"name"];
//3.2设置属性类型
[nameDesc setAttributeType:NSStringAttributeType];
//3.3设置属性默认值
[nameDesc setDefaultValue:@"无名氏"];
NSAttributeDescription * ageDesc = [[NSAttributeDescription alloc]init];
[ageDesc setName:@"age"];
[ageDesc setAttributeType:NSInteger64AttributeType];
[ageDesc setDefaultValue:@0];
//4.设置实体的属性
[personEn setProperties:[NSArray arrayWithObjects:nameDesc,ageDesc, nil]];
//5.将实体合成到数据模型中
[model setEntities:@[personEn]];
return model;
}
//字面量
// NSDictionary* dic =@{
// @"key": @"value",
// @"key2":@"value2",
// @"dic":@{
// @"dic1": @"value1"
// }
// };
// //可变 copy ,将不可变对象 copy 为可变对象
// [dic mutableCopy];
int main(int agrc,char * argv[])
{
//二.持久化设置
//初始化持久化存储对象
NSPersistentStoreCoordinator * coor = [[NSPersistentStoreCoordinator alloc]initWithManagedObjectModel:model()];
//设置持久化存储对象
NSURL * url = [NSURL fileURLWithPath:@"/Users/cora1n/Desktop/test.sqlite"];
//指定 持久化存储类型
[coor addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:url
options:nil error:nil];
//三.初始化托管对象上下文
NSManagedObjectContext * context = [[NSManagedObjectContext alloc]init];
//1.设置托管对象上下文的存储坐标
[context setPersistentStoreCoordinator:coor];
//2.写入操作
//2.1 从上下文中获取实体对象
NSEntityDescription * person = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:context];
//2.2 通过实体对象 初始化托管对象,并 插入到 托管对象上下文中
NSManagedObject * personMO = [[NSManagedObject alloc]initWithEntity:person insertIntoManagedObjectContext:context];
//2.2.1 设置托管对象的 name, age 属性
[personMO setValue:@"zhangsan" forKey:@"name"];
[personMO setValue:@22 forKey:@"age"];
//持久化!!!
[context save:nil];
//3.读取操作
//初始化 抓取请求 ,指定 抓取的实体名称
NSFetchRequest * request= [[NSFetchRequest alloc]initWithEntityName:@"Person"];
NSError * err;
NSArray * persons;
@try {
//代码可能出现异常
persons =[context executeFetchRequest:request error:&err];
}
@catch (NSException *exception) {
//抓取异常,并进行处理
NSLog(@"%@",exception);
}
@finally {
NSLog(@"最终执行代码");
}
//执行 抓取请求
if (err) {
NSLog(@"%@",err);
}
for (id person in persons) {
NSLog(@"%@",person);
}
//Entity 表
//ManagedObject 记录
/*<NSManagedObject: 0x100404680>
(
entity: Person;
id: 0x80000b <x-coredata://E530278B-EDA4-426D-A7C2-0936C5DB1ABA/Person/p2> ;
data: {
age = 22;
name = zhangsan;
}
)
*/
//0 代表正常结束
return 0;
}