CoreData的持久化存儲

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

        }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章