CoreData

พฤศจิกายน 11, 2010 ใส่ความเห็น Go to comments

วีธีการใช้ 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]];

Categories: CoreData, iPhone
  1. ยังไม่มีความเห็น
  1. No trackbacks yet.

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Connecting to %s

Follow

Get every new post delivered to your Inbox.