概述
CoreData的核心概念是托管对象。托管对象是由Core Data管理的简单模型对象,但必须是NSManagedObject类或者其子类的实例。托管对象模型包含一些应用程序托管对象实体的描述,描述中包括属性,关系等。
Core Data中常用的类
Core Data 的初步建立
建立模型对象类
@property (nonatomic, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;
@property (nonatomic, readonly) NSManagedObjectContext *managedObjectContext;
- (NSURL *)dataStoreURL;
- (Car *)makeNewCar;
- (NSArray *)carListAfterFetch;
返回数据存储的URL函数
- (NSURL *)dataStoreURL
{
static NSString *fileName = @"Car.sql";
NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *filePath = [docDir stringByAppendingPathComponent:fileName];
NSURL *fileURL = [NSURL fileURLWithPath:filePath];
return fileURL;
}数据模型NSManagedObjectModel
- (NSManagedObjectModel *)managedObjectModel
{
if (_managedObjectModel)
{
return _managedObjectModel;
}
_managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil];
return _managedObjectModel;
}使用持久化存储协调器,链接到数据模型
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (_persistentStoreCoordinator)
{
return _persistentStoreCoordinator;
}
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
NSError *error;
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:[self dataStoreURL]
options:nil
error:&error])
{
NSLog(@"Error: %@", error);
}
return _persistentStoreCoordinator;
}建立托管对象上下文,记录对象图的所有变化。在一些时候,可以执行抓取数据信息并进行检索等等。
- (NSManagedObjectContext *)managedObjectContext
{
if (_managedObjectContext)
{
return _managedObjectContext;
}
_managedObjectContext = [[NSManagedObjectContext alloc] init];
[_managedObjectContext setPersistentStoreCoordinator:[self persistentStoreCoordinator]];
return _managedObjectContext;
}一个创建汽车实例的方法
- (Car *)makeNewCar
{
Car *newCar = [NSEntityDescription insertNewObjectForEntityForName:@"Car"
inManagedObjectContext:[self managedObjectContext]];
return newCar;
}检索数据方法,返回一个数组储存目前存在的实例的信息
- (NSArray *)carListAfterFetch
{
NSError *error;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Car" inManagedObjectContext:[self managedObjectContext]];
fetchRequest.entity = entity;
NSArray *listOfCars = [[self managedObjectContext] executeFetchRequest:fetchRequest error:&error];
return listOfCars;
}测试
CarModel *carModel = [[CarModel alloc] init];
NSManagedObjectContext *carContext = [carModel managedObjectContext];
Car *car1 = [carModel makeNewCar];
car1.brand = @"BMW";
car1.type = @"SUV";
[carContext save:nil];
NSArray *listOfCars = [carModel carListAfterFetch];
[listOfCars enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"CarInList[%i] : %@", idx, [obj brand]);
}];
Car *rollbackCar = [listOfCars objectAtIndex:0];
rollbackCar.brand = @"AUDI";
if ([carContext hasChanges]) {
[carContext rollback];
}
listOfCars = [carModel carListAfterFetch];
[listOfCars enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"CarInList[%i] : %@", idx, [obj brand]);
}];
[carContext deleteObject:car1];
[carContext save:nil];
listOfCars = [carModel carListAfterFetch];
if ([listOfCars count] == 0) {
NSLog(@"NULL");
}
else {
[listOfCars enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"CarInList[%i] : %@", idx, [obj brand]);
}];
}打印的结果是
2013-08-01 21:46:14.862 CoreDataTest[721:c07] CarInList[0] : BMW
2013-08-01 21:46:14.864 CoreDataTest[721:c07] NULL
总结
CoreData不光能操纵SQLite,CoreData和iCloud的结合也很好,如果有这方面需求的话优先考虑CoreData。
管理undo/redo操作。
检查托管对象的属性值是否正确。
601



被折叠的 条评论
为什么被折叠?



