Core Data是一个强大的对象图形化管理和对象持久化的框架。
Core Data 是 iOS SDK 里的一个很强大的框架,允许程序员以面向对象的方式储存和管理数据。Core Data 不是一个数据库。
Core Data框架提供了对象-关系映射(ORM)的功能,既能够将OC对象转化成数据,保存在SQLite3数据库文件中,也能够将保存在数据库中的数据还原成OC对象。在此数据操作期间,不需要编写任何SQL语句。
使用Core Data,首先要添加CoreData.framework和导入主头文件#import<CoreData/CoreData.h>
创建模型文件
添加实体
实体(entity)是数据模型的基石
第一步:新建项目
新建项目,勾选 Use Core Data
第二步:界面准备
UIAlertController*alert = [UIAlertControlleralertControllerWithTitle:@""message:@""preferredStyle:UIAlertControllerStyleAlert];
[alert addTextFieldWithConfigurationHandler:^(UITextField* _Nonnull textField) {
textField.placeholder =@"请输入用户名";
}];
[alert addTextFieldWithConfigurationHandler:^(UITextField* _Nonnull textField) {
textField.placeholder =@"请输入年龄";
}];
[alert addAction:[UIAlertActionactionWithTitle:@"取消"style:UIAlertActionStyleCancelhandler:nil]];
[alert addAction:[UIAlertActionactionWithTitle:@"保存"style:UIAlertActionStyleDestructivehandler:^(UIAlertAction* _Nonnull action) {
// ...}
]];
[selfpresentViewController:alert animated:YEScompletion:nil];
第三步:创建数据模型
一个实体表示应用程序中有意义的一部分数据
Entity:是Core Data中的一个类,我们可以把实体类比为数据库中的表或者数据模型
创建实体对应的代码文件
NSManagedObject
通过Core Data从数据库取出的对象,默认情况下都是NSManagedObject对象
NSManagedObject的工作模式有点类似于NSDictionary对象,通过键-值对来存取所有的实体属性
setValue:forKey:存储属性值
valueForKey:获取属性值
NSManagedObjectContext 用途:负责应用和数据库之间的交互(CRUD)
.persistentStoreCoordinator
NSPersistentStoreCoordinator 用途:添加持久化存储库(比如SQLite数据库)
.managedObjectModel
NSManagedObjectModel 用途:代表Core Data的模型文件
.entities
NSEntityDescription 用途:用来描述实体
.name = @“Card”
搭建Core Data上下文环境
//从应用程序包中加载模型文件
NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];
//传入模型,初始化NSPersistentStoreCoordinator
NSPersistentStoreCoordinator *psc = [[[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model] autorelease];
//构建SQLite文件路径
NSString *docs = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSURL *url = [NSURL fileURLWithPath:[docs stringByAppendingPathComponent:@"person.data"]];
//添加持久化存储库,这里使用SQLite作为存储库
NSError *error = nil;
NSPersistentStore *store = [psc addPersistentStoreWithType:NSSQliteStoreType configuration:nil URL:url options:nil error:&error];
if(store == nil){//直接抛异常
[NSException raise:@"添加数据库错误" format:@"%@", [error localizedDescription] ];
}
初始化上下文,设置persistentStoreCoordinator属性
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] init];
context.persistentStoreCoordinator = psc;
第四步:添加数据
NSManagedObject *person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:context];
//设置属性
[person setValue:@"MJ" forKey:@"name"];
[person setValue:[NSNumber numberWithInt:27] forKey:@"age"];
//传入上下文,创建一个Card实体对象
NSManagedObject *card = [NSEntityDescription insertNewObjectForEntityForName:@"Card" inManagedObjectContext:context];
[card setValue:@"1234567890" forKey:@"no"];
//设置Person和Card之间的关联关系
[person setValue:card forKey:@"card"];
//利用上下文对象,将数据同步到持久化存储库
NSError *error = nil;
BOOL success = [context save:&error];
if (!success) {
[NSException raise:@"访问数据库错误" format:@"%@", [error localizedDescription]];
}
如果是想做更新操作:只要在更改了实体对象的属性后调用[context save:&error],就能将更改的数据同步到数据库
第五步:查询数据
//初始化一个查询请求
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
//设置要查询的实体
NSEntityDescription *desc = [NSEntityDescription entityForName:@"Person" inManagedObjectContext: context];
//设置排序(按照age降序)
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:NO];
request.sortDescriptors = [NSArray arrayWithObject:sort];
//设置条件过滤(name like '%Itcast-1%')
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like %@", @"*Itcast-1*"];
request.predicate = predicate;
//执行请求
NSError *error = nil;
NSArray *objs = [context executeFetchRequest:request error:&error];
if (error) {
[NSException raise:@"查询错误" format:@"%@", [error localizedDescription]];
}
//遍历数据
for (NSManagedObject *obj in objs) {
NSLog(@"name=%@", [obj valueForKey:@"name"]
}
删除数据
//传入需要删除的实体对象
[context deleteObject:managedObject];
//将结果同步到数据库
NSError *error = nil;
[context save:&error];
if (error) {
[NSException raise:@"删除错误" format:@"%@", [error localizedDescription]];
未完待续。。。