CoreData
วีธีการใช้ CoreData (ไม่ได้สร้าง Project with CoreData แต่เป็นการเพิ่มที่หลังนะครับ)
ทำการ Add CoreData.framework เข้าไปใน Project
Import Framework ใน ProjectName_Prefix.pch (ส่วนใหญ่อยู่ใน Other Sources)
#import <Availability.h>
#ifndef __IPHONE_3_0
// #warning “Projects that use Core Data only build using iPhone SDK 3.0 and later”
#endif
#ifdef __OBJC__
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import <CoreData/CoreData.h>
#endif
สร้าง File Data Model โดยเลือก Add -> New FIle เลือกที่ Resource -> Data Model
ออบแบบ Data Model (ใน File .xcdatamodel)
โดยเพิ่ม Class ในส่วนของ Entity (เครื่องหมาย +) แล้วตั้งชื่อ Class
และ Attribute ใน Property (เครื่องหมาย +) สำหรับ Attribute ต้องทำการกำหนดชนิดด้วย
หลังจากออกแบบ Data Model เสร็จแล้วให้ Add -> New File ใน Cocoa Touch Class เลือก Managed Object Class
ในหน้าที่ 3 ให้เลือก Class ที่ต้องการทำการ Generate Class จะได้ File Class.h และ Class.m มาใช้งาน
เข้าไปที่ File AppDelegate.h
ทำการเพิ่ม Property
NSPersistentStoreCoordinator *persistentStoreCoordinator;
NSManagedObjectModel *managedObjectModel;
NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;
@property (nonatomic, readonly) NSString *applicationDocumentsDirectory;
AppDelegate.m
สร้าง Object ของ NSManagedObjectContext ใน
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
NSManagedObjectContext *context = [self managedObjectContext];
if (!context) {
// Handle the error.
}
ใน Method
- (void)applicationWillTerminate:(UIApplication *)application;
เพิ่ม
NSError *error;
if (managedObjectContext != nil) {
if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
// Handle the error.
}
}
ใน dealloc
[managedObjectContext release];
[managedObjectModel release];
[persistentStoreCoordinator release];
เพิ่ม Method ที่ทำงานเป็น Getter สำหรับ Property แต่ละตัวที่เพิ่มเข้าไป
- (NSManagedObjectContext *) managedObjectContext {
if (managedObjectContext != nil) {
return managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
managedObjectContext = [[NSManagedObjectContext alloc] init];
[managedObjectContext setPersistentStoreCoordinator: coordinator];
}
return managedObjectContext;
}
- (NSManagedObjectModel *)managedObjectModel {
if (managedObjectModel != nil) {
return managedObjectModel;
}
managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];
return managedObjectModel;
}
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (persistentStoreCoordinator != nil) {
return persistentStoreCoordinator;
}
NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @”CoreDataName.sqlite”]];
NSError *error;
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];
if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&error]) {
// Handle the error.
}
return persistentStoreCoordinator;
}
- (NSString *)applicationDocumentsDirectory {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
return basePath;
}
สร้าง MainViewController
ใน MainViewController.h สร้าง Property สำหรับเก็บข้อมูล และ NSManagedObjectContext
NSMutableArray *dataArray;
NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain) NSMutableArray *dataArray;
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
ใน MainViewController.m
ทำ Synthesize Property
@synthesize dataArray, managedObjectContext;
การดึงข้อมูล (ถ้าไม่ต้องการ Sort ก็ไม่จำเป็นต้องใส่ส่วนของ NSSortDescriptor)
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:managedObjectContext];
[request setEntity:entity];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@”name” ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[request setSortDescriptors:sortDescriptors];
[sortDescriptor release];
[sortDescriptors release];
NSError *error = nil;
NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
if (mutableFetchResults == nil) {
// Handle the error.
}
[self setDataArray:mutableFetchResults];
[mutableFetchResults release];
[request release];
การเพิ่มข้อมูล
Person *person = (Person *)[NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:managedObjectContext];
[person setName:@"Name"];
[person setSurname:@"Surname"];
NSError *error;
if (![managedObjectContext save:&error]) {
// Handle the error.
}
[dataArray addObject:person];
การลบข้อมูล
NSManagedObject *personToDelete = [dataArray objectAtIndex:index];
[managedObjectContext deleteObject:personToDelete];
NSError *error;
if (![managedObjectContext save:&error]) {
// Handle the error.
}
[dataArray removeObjectAtIndex:index];
การแก้ไขข้อมูล
Person *p = (Person *)[dataArray objectAtIndex:index];
p.name = nameField.text;
p.surename = surenameField.text
if (![p.managedObjectContext save:&error]){
// Handle the error.
}
กลับไปที่ AppDelegate.m
#import “MainViewController.h”
ใน -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
สร้าง MainViewController แล้วกำหนด managedObjectContext
MainViewController *mainViewController = [[MainViewController alloc] init];
NSManagedObjectContext *context = [self managedObjectContext];
if (!context) {
// Handle the error.
}
mainViewController.managedObjectContext = context;
[window addSubview:mainViewController.view];
[window makeKeyAndVisible];
[mainViewController.view release];
วิธีการ Filter ข้อมูลสร้าง Method (ใช้การดึงข้อมูล แต่มีการใช้ NSPredicate)
-(NSMutableArray *) filterObjectInContextEntityName:(NSString *)entityName predicate:(NSPredicate *)predicate sortKey:(NSString *)sortKey sortAscending:(BOOL) sortAscending managedObjectContext:(NSManagedObjectContext *)context{
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:context];
[request setEntity:entity];
if (predicate != nil) {
[request setPredicate:predicate];
}
if (sortKey != nil) {
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:sortKey ascending:sortAscending];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[request setSortDescriptors:sortDescriptors];
[sortDescriptor release];
[sortDescriptors release];
}
NSError *error = nil;
NSMutableArray *mutableFetchResults = [[[managedObjectContext executeFetchRequest:request error:&error] mutableCopy] autorelease];
if (mutableFetchResults == nil) {
// Handle the error.
}
[request release];
return mutableFetchResults;
}
ตัวอย่างการใช้งาน
[self setDataArray:[self filterObjectInContextEntityName:@"Person" predicate:[NSPredicate predicateWithFormat:@"(surename == %@)", surenameField.text] sortKey:@”name” sortAscending:YES managedObjectContext:managedObjectContext]];