在使用Core Data前,要引入”#import <CoreData/CoreData.h>
“头文件。
在使用Core Data时,我们是通过NSManagedObjectModel(托管对象模型)
、NSPersistentStoreCoordinator(持久化存储协调器)
、NSPersistentStore(持久化存储库)
、NSManagedObjectContext(托管对象上下文)
、NSManagedObject(托管对象)
等类来操作的。
当然,使用Core Data可以通过两种方法来实现:在创建工程时选择”Use Core Data”,或者自己在控制器中使用。
一.在创建工程时选择”Use Core Data”
此种情况,Xcode会自动帮你创建.xcdatamodeld
文件,它也会在AppDelegate
文件中以懒加载的方式来创建Core Data使用到的三个类的对象。
其中,Xcode创建的- (NSURL *)applicationDocumentsDirectory;
方法用于定位文件位置:
- (NSURL *)applicationDocumentsDirectory {
//.应用使用这个目录来存储Core Data库文件
return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}
1.NSManagedObjectModel *managedObjectModel;
- (NSManagedObjectModel *)managedObjectModel {
if (_managedObjectModel != nil) {
return _managedObjectModel;
}
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"CoreData" withExtension:@"momd"];
_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return _managedObjectModel;
}
2.NSPersistentStoreCoordinator *persistentStoreCoordinator;
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (_persistentStoreCoordinator != nil) {
return _persistentStoreCoordinator;
}
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"CoreData.sqlite"];
NSError *error = nil;
NSString *failureReason = @"There was an error creating or loading the application's saved data.";
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
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];
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return _persistentStoreCoordinator;
}
3.NSManagedObjectContext *managedObjectContext;
- (NSManagedObjectContext *)managedObjectContext {
if (_managedObjectContext != nil) {
return _managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (!coordinator) {
return nil;
}
_managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[_managedObjectContext setPersistentStoreCoordinator:coordinator];
return _managedObjectContext;
}
以上就是Xcode为我们创建的三个用于操作Core Data的三个对象。
二.手动创建代码来使用Core Data:
手动创建代码来使用Core Data的话,首先在头文件中引入”#import <CoreData/CoreData.h>
“头文件,然后创建一个模型文件:
接下来我们使用代码来操作Core Data,代码如下:
1.搭建上下文
//从应用程序包中加载模型文件,"Model"是上图创建的Core Data文件名。
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"];
NSManagedObjectModel* model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
//传入模型对象,初始化NSPersistentStoreCoordinator
NSPersistentStoreCoordinator* psc=[[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
//构建数据库文件的路径
NSString* docs=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
//添加持久化存储库,这里使用sqlite作为存储库
NSError* error=nil;
NSPersistentStore* store=[psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:&error];
if (store==nil) {
[NSException raise:@"data error" format:@"%@",[error localizedDescription]];
}
//初始化上下文,设置persistentStoreCoordinator属性
NSManagedObjectContext* context=[[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[context setPersistentStoreCoordinator:psc];
NSLog(@"ok");
2.添加数据到//传入上下文,创建Person实体对象
NSManagedObject* person=[NSEntityDescription insertNewObjectForEntityForName:@”Person” inManagedObjectContext:context];
//设置Person的属性
[person setValue:@”Ricky” forKey:@”name”];
[person setValue:[NSNumber numberWithInteger:27] forKey:@”age”];
//传入上下文,创建一个Card对象
NSManagedObject* card=[NSEntityDescription insertNewObjectForEntityForName:@"Card" inManagedObjectContext:context];
[card setValue:@"22222" forKey:@"no"];
//设置person和card关系
[person setValue:card forKey:@"card"];
//利用上下文,将数据同步到持久化存储库
NSError* error1=nil;
BOOL success=[context save:&error1];
if (!success) {
NSLog(@"error1");
}
3.查询数据
//从数据库中查询数据
NSFetchRequest* request=[[NSFetchRequest alloc] init];
request.entity=[NSEntityDescription entityForName:@"Person" inManagedObjectContext:context];
//设置排序
NSSortDescriptor* sort=[NSSortDescriptor sortDescriptorWithKey:@"age" ascending:NO];
request.sortDescriptors=[NSArray arrayWithObject:sort];
//设置过滤条件
NSPredicate* predicate=[NSPredicate predicateWithFormat:@"name like%@",@"*ick*"];
request.predicate=predicate;
NSError* error2=nil;
NSArray* objs=[context executeFetchRequest:request error:&error2];
if (error2) {
NSLog(@"error2");
return;
}
for(NSManagedObject* obj in objs){
NSLog(@"name=%@",[obj valueForKey:@"name"]);
}
3.删除数据
//删除实体对象
[context deleteObject:card];
NSError* error4;
[context save:&error4];
if (error4) {
NSLog(@"error4");
}
执行结果为: