關鍵詞: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
}
}