关键词:NSFetchedResultsController,NSFetchRequest,NSEntityDescription,
NSManagedObject,NSManagedObjectContext,NSManagedObjectModel,NSPersistentStoreCoordinator,
xxx.xcdatamodeld.
以一个Person类的存储为例,描述CoreData的数据存储,包含写入,读取以及修改数据。还有强大的谓词表达式的使用方法。
1,创建一个协调对象的协调员
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (__persistentStoreCoordinator != nil) {
return __persistentStoreCoordinator;
}
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"dataCache.sqlite"];
//[[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil];
NSError *error = nil;
__persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return __persistentStoreCoordinator;
}
2,创建一个管理数据对象的指针NSManagedObjectContext
- (NSManagedObjectContext *)managedObjectContext
{
if (__managedObjectContext != nil) {
return __managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
__managedObjectContext = [[NSManagedObjectContext alloc] init];
[__managedObjectContext setPersistentStoreCoordinator:coordinator];
}
return __managedObjectContext;
}
3,创建需要管理的对象模型NSManagedObjectModel
- (NSManagedObjectModel *)managedObjectModel
{
if (__managedObjectModel != nil) {
return __managedObjectModel;
}
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"dataCache" withExtension:@"momd"];
__managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return __managedObjectModel;
}
4,创建一个managed对象 Person
//Person.h
@interface Person : NSManagedObject{
}
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSNumber * old;
@end
//Person.m
@implementation Person
@dynamic name;
@dynamic old;
@end
5,写入对象到managedContext
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[dict setValue:[NSString stringWithFormat:@"张三"] forKey:@"name"];
[dict setValue:[NSNumber numberWithInt:1] forKey:@"old"];
Person *person = (Person*)[NSEntityDescription insertNewObjectForEntityForName:@"Person"inManagedObjectContext:_managedObjectContext];
[person setValuesForKeysWithDictionary:dict];
[dict release];
6,写入到磁盘
NSError *error;
if (![_managedObjectContext save:&error]) {
NSLog(@"error :%@",[error1 description]);
}
7,读取数据
- (NSFetchedResultsController *)fetchedResultsController {
if (fetchedResultsController != nil) {
return fetchedResultsController;
}
//创建一个访问对象的fetch request
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Model" inManagedObjectContext:_managedObjectContext];
[fetchRequest setEntity:entity];
// Create the sort descriptors array.
//创建一个提供排序的描述符数组
NSSortDescriptor *authorDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
NSSortDescriptor *titleDescriptor = [[NSSortDescriptor alloc] initWithKey:@"old" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:authorDescriptor, titleDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
// 创建并初始化一个NSFetchedResultsController.
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:_managedObjectContext sectionNameKeyPath:@"name" cacheName:@"Root"];
self.fetchedResultsController = aFetchedResultsController;
NSLog(@"fetched objects count :%d",[aFetchedResultsController.fetchedObjects count]);
fetchedResultsController.delegate = self;
// Memory management.
[aFetchedResultsController release];
[fetchRequest release];
[authorDescriptor release];
[titleDescriptor release];
[sortDescriptors release];
return fetchedResultsController;
}
-(void)getData
{
NSError *error;
[self.fetchedResultsController performFetch:&error];
//从managedObjectContext里读取数据
NSMutableArray *mutableFetchResult = [[_managedObjectContext executeFetchRequest:request error:nil] mutableCopy];
}
8,更新数据
for (Person *person in self.fetchedResultsController.fetchedObjects) {
//更新数据
//可以通过谓词NSPredicate过滤出来需要修改的对象,例如
NSPredicate *perdicate=[NSPredicate predicateWithFormat:@"old>10"];
BOOL match=[perdicate evaluateWithObject:person];
if(match)
{
//delete it
}
}