วันศุกร์ที่ 26 พฤศจิกายน พ.ศ. 2553

CoreData Multiple Entity Relationship

สำหรับ Entry นี้จะเป็นเรื่องของการสร้าง Entity มากกว่า 1 ตัวนะครับ
ใน Entry นี้จะไม่ทำเรื่องของ UI นะครับ
จะแสดงแค่วิธีการ เอาไปประยุกต์เองนะครับ

เริ่มจากการเพิ่ม Entity ใน File CoreDataFromTemplate.xcdatamodel
(File .xcdatamodel ที่เราออกแบบตัวเก็ยข้อมูล ดูได้ใน Entry เก่าครับ)
ผมจะเพิ่ม Entity เข้าไป 2 ตัวนะครับ เป็น A กับ B
และทั้ง A และ B จะมี Property name นะครับ



เราจะทำ Relation ระหว่าง A และ B นะครับ
รูปแบบก็เป็น A has_many B ละกันครับ

เริ่มจากเพิ่ม Relationship ใน A และ B ครับ
เลือก Entity A แล้วไปที่ส่วนของ Property กดที่เครื่องหมาย + เลือก Add Relationship
ผมตั้งชื่อว่า bList นะครับ Destination เลือก Entity B เลือกช่อง To-Many Relationship




หลังจากนั้นเลือก Entity B ครับ
เพิ่ม Relationship ใน Property ครับ
ผมตั้งชื่อว่า a นะครับ Destination เลือก Entity A และ Inverse เลือก bList ครับ



Save ครับ

สร้าง File ใหม่ครับ เลือก Add -> New File… เลือก Managed Object Class



ที่หน้าของ Managed Object Class Generation เลือก Entity A และ B กด Finish



จะได้ File เพิ่มมา 4 File 



เริ่มจากเข้าไปที่ MainViewController.h ทำการ Import File ที่เพิ่มขึ้นมา

#import "A.h"
#import "B.h"



ใน MainViewController.m ที่ Method viewDidLoad
ทำการสร้าง A โดยให้ชื่อ A1

A *a = (A *)[NSEntityDescription insertNewObjectForEntityForName:@"A" inManagedObjectContext:managedObjectContext];
a.name = @"A1";
NSError *error;
if (![managedObjectContext save:&error]) {
}



สร้าง Entity B โดยใส่ Entity B เข้าไปใน A ที่สร้างขึ้น
จะมี Method addBListObject: ซึ่งเป้น Method ที่ถูก Generate สามารถดูได้ใน A.h ครับ

B *b = (B *)[NSEntityDescription insertNewObjectForEntityForName:@"B" inManagedObjectContext:managedObjectContext];
b.name = @"B1";
[a addBListObject:b]; // <<<<<
if (![managedObjectContext save:&error]) {
}
b = (B *)[NSEntityDescription insertNewObjectForEntityForName:@"B" inManagedObjectContext:managedObjectContext];
b.name = @"B2";
[a addBListObject:b]; // <<<<<
if (![managedObjectContext save:&error]) {
}



ผมสร้าง B ขึ้นมา 2 ตัวนะครับ B1 และ B2 ใส่เข้าไปใน Object A

การแสดงผล เริ่มจากการเรียกข้อมูล A ก่อน

NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"A" inManagedObjectContext:managedObjectContext];
[request setEntity:entity];
NSMutableArray *aArray = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
if (aArray == nil) {
}
[request release];
[aArray release];



หลังจากนั้นในแต่ละ Entity A จะมี B อยู่ทำการเรียกข้อมูล B จาก A

NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"A" inManagedObjectContext:managedObjectContext];
[request setEntity:entity];
NSMutableArray *aArray = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
if (aArray == nil) {
}
[request release];
// ********************* Begin *************************
NSManagedObject *selectObject;
NSPredicate *predicate;
for (A *a in aArray) {
NSLog(@"*** A %@ ***\n", a.name);
selectObject = a;
predicate = [NSPredicate predicateWithFormat:@"a == %@", selectObject];
request = [[NSFetchRequest alloc] init];
entity = [NSEntityDescription entityForName:@"B" inManagedObjectContext:managedObjectContext];
[request setEntity:entity];
[request setPredicate:predicate];
NSMutableArray *bArray = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
if (bArray == nil) {
}
for (B *b in bArray) {
NSLog(@"B %@", b.name);
}
[request release];
[bArray release];
}
// *********************** End **************************
[aArray release];



จะแสดงข้อมูล A และ B ที่อยู่ใน A ออกมาครับ
การลบนะครับ จะมี Method removeBListObject อยู่ครับ
(ผมแทรกหลัง For ของการแสดง B ครับ)

// ********************* Begin ***********************
selectObject = [aArray objectAtIndex:0];
predicate = [NSPredicate predicateWithFormat:@"a == %@", selectObject];
request = [[NSFetchRequest alloc] init];
entity = [NSEntityDescription entityForName:@"B" inManagedObjectContext:managedObjectContext];
[request setEntity:entity];
[request setPredicate:predicate];
NSMutableArray *bArray = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
if (bArray == nil) {
}
[(A *)selectObject removeBListObject:[bArray objectAtIndex:0]];
[request release];
[bArray release];
// ********************** End ***********************



ถ้าใส่ Code การแสดงผลอีกที B1 จะหายไปครับ
(รูปสุดท้ายเป็น Code ทั้งหมดที่เพิ่มใน viewDidLoad โดยยังไม่มีการแสดงผลรอบ 2 นะครับ)






ไม่มีความคิดเห็น:

แสดงความคิดเห็น