Core Data

时间:2023-03-09 23:58:15
Core Data

•   Core Data   是 iOS SDK   里的一个很强大的框架,允许程序员 以面向对象 的方式储存和管理数据 。使用 Core Data 框架,程序员可以很轻松有效 地通过面向对象的接口管理数据  


 
Core Data
框架提供了
对象
-
关系映射
(ORM)
的功能,即能够将
OC
对象转 化成数据,保存在
SQLite3
数据库文件中,也能够将保存在数据库中的 数据还原成
OC
对象
 



 
在数据操作过程中,无需编写任何
SQL
语句
 


•  
要使用
Core Data
,
需要导入
CoreData
框架


Core Data 主要对象


 
NSManagedObjectContext
:负责应用和数据库之间的交互
(CRUD)



 
NSPersistentStoreCoordinator
:添加持久化存储库(如
SQLite
数据 库),
是物理数据存储的物理文件和程序之间的联系的桥梁
,负责管 理
不同对象上下文



 
NSManagedObjectModel
:被管理的对象模型

三者关系 参考:

#pragma mark - Core Data stack

@synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator; - (NSURL *)applicationDocumentsDirectory {
// The directory the application uses to store the Core Data store file. This code uses a directory named "nyhx.Core_Data" in the application's documents directory.
return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
} - (NSManagedObjectModel *)managedObjectModel {
// The managed object model for the application. It is a fatal error for the application not to be able to find and load its model.
if (_managedObjectModel != nil) {
return _managedObjectModel;
}
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Core_Data" withExtension:@"momd"];
_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return _managedObjectModel;
} - (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
// The persistent store coordinator for the application. This implementation creates and returns a coordinator, having added the store for the application to it.
if (_persistentStoreCoordinator != nil) {
return _persistentStoreCoordinator;
} // Create the coordinator and store _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Core_Data.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]) {
// Report any error we got.
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: userInfo:dict];
// Replace this with code to handle the error appropriately.
// abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
} return _persistentStoreCoordinator;
} - (NSManagedObjectContext *)managedObjectContext {
// Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.)
if (_managedObjectContext != nil) {
return _managedObjectContext;
} NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (!coordinator) {
return nil;
}
_managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[_managedObjectContext setPersistentStoreCoordinator:coordinator];
return _managedObjectContext;
} #pragma mark - Core Data Saving support - (void)saveContext {
NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
if (managedObjectContext != nil) {
NSError *error = nil;
if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
// Replace this implementation with code to handle the error appropriately.
// abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
}
}

•   NSEntityDescription :实体描述


新增记录(NSEntityDescription)

//_context--->NSManagedObjectContext

Person
 
*p = [
NSEntityDescription
insertNewObjectForEntityForName
:
@"Person"
inManagedObjectContext
:
_context
];


p.
name
 
=
 
@"
张三
"
; p.
age
 
=
 
@18
;


[
_context
 
save
:
nil
];

查询数据(NSFetchRequest)

NSFetchRequest
 
*request = [
NSFetchRequest
fetchRequestWithEntityName
:
@"Person"
];


request.
predicate
 
= [
NSPredicate
predicateWithFormat
:
@"%K LIKE '*52*' OR name CONTAINS '

'"
,
 
@"phoneNo"
];


NSArray
 
*array = [
_context
executeFetchRequest
:request
 
error
:
nil
];

删除数据

NSArray * mutablFetchResult = [_context executeFetchRequest:request error:&error];

for (User*user in mutableFetchResult) {

[_context deleteObject:user];

}

//判断是否删除成功

BOOL isDeleteSuccess = [_context save:&error];//保存(容易忘)

修改

NSArray * mutablFetchResult = [_context executeFetchRequest:request error:&error];

for (User*user in mutablFetchResult) {

[user setAge:[NSNumber numberWithInteger:999]];

}

//判断是否修改成功

BOOL isSaveSuccess = [_context save:&error];//保存(容易忘)


创建好实体后,可以通过添加NSManagedObject subclass文件,系统可以自动添加实体对应的数据模型类,如图所示:

Core Data

Core Data

Core Data

Core Data