雙向關系
雙向的時候,只用指定一邊,另外一邊自動指定,比如,如果一個帳號只有一個聯系人,而一個聯系人對應一個帳號的話,那么帳號表和聯系人表就是一一對應的關系,將他們指定為雙向的,如下面將cnt1.act = act1; cnt2.act = cnt2;則act1.cnt和act2.cnt也是有值的。注釋掉的兩句可有可無。
刪除規則
這里將Account表下面的cnt的刪除規則設定為cascade,則在刪除act1的時候,cnt1也被刪除了。而Contact表沒有將它下面的act的刪除規則設置為cascade,在刪除cnt1的時候,act1還存在。
一對多的關系
上面假設一個帳號只有一個聯系人是不合理的,那只是一種假設,一般都是一個帳號下面有很多聯系人,這就是一對多的關系,上面的兩個法則也適用於這種關系,也就是說帳號下面的cnt設置為cascade,刪除一個帳號時,它所有的聯系人也被刪除了,而聯系人表下面的act設置為nullify,當刪除一個聯系人的時候帳號表沒有變化。
Account *act1 = [NSEntityDescription insertNewObjectForEntityForName:@"Account" inManagedObjectContext:self.managedObjectContext];
act1.passport = @"passport1";
act1.password = @"password1";
Account *act2 = [NSEntityDescription insertNewObjectForEntityForName:@"Account" inManagedObjectContext:self.managedObjectContext];
act2.passport = @"passport2";
act2.password = @"password2";
Contact *cnt1 = [NSEntityDescription insertNewObjectForEntityForName:@"Contact" inManagedObjectContext:self.managedObjectContext];
cnt1.passport = @"passport1";
cnt1.nickname = @"nickname1";
cnt1.act = act1;
Contact *cnt2 = [NSEntityDescription insertNewObjectForEntityForName:@"Contact" inManagedObjectContext:self.managedObjectContext];
cnt2.passport = @"passport2";
cnt2.nickname = @"nickname2";
cnt2.act = act2;
// act1.cnt = cnt1;
// act2.cnt = cnt2;
[self.managedObjectContext save:nil];
// Delete a Account
NSFetchRequest *fr = [[NSFetchRequest alloc] init];
NSEntityDescription *ed = [NSEntityDescription entityForName:@"Account" inManagedObjectContext:self.managedObjectContext];
[fr setEntity:ed];
NSArray *ary = [self.managedObjectContext executeFetchRequest:fr error:nil];
for (Account *act in ary) {
//NSLog(@"%@ %@ %@ %@", act.passport, act.password, act.cnt.passport, act.cnt.nickname);
if ([act.passport isEqualToString:@"passport2"]) {
NSLog(@"DEL passport2");
[self.managedObjectContext deleteObject:act];
}
}
[self.managedObjectContext save:nil];
// Delete a Contact
NSFetchRequest *fr = [[NSFetchRequest alloc] init];
NSEntityDescription *ed = [NSEntityDescription entityForName:@"Contact" inManagedObjectContext:self.managedObjectContext];
[fr setEntity:ed];
NSArray *ary = [self.managedObjectContext executeFetchRequest:fr error:nil];
NSLog(@"%d", ary.count);
for (Contact *cnt in ary) {
//NSLog(@"%@ %@ %@ %@", act.passport, act.password, act.cnt.passport, act.cnt.nickname);
if ([cnt.nickname isEqualToString:@"nickname1"]) {
NSLog(@"DEL nickname1");
[self.managedObjectContext deleteObject:cnt];
}
}
[self.managedObjectContext save:nil];
// From Account
NSFetchRequest *fr = [[NSFetchRequest alloc] init];
NSEntityDescription *ed = [NSEntityDescription entityForName:@"Account" inManagedObjectContext:self.managedObjectContext];
[fr setEntity:ed];
NSArray *ary = [self.managedObjectContext executeFetchRequest:fr error:nil];
for (Account *act in ary) {
NSLog(@"%@ %@ %@ %@", act.passport, act.password, act.cnt.passport, act.cnt.nickname);
}
// From Contact
NSFetchRequest *fr = [[NSFetchRequest alloc] init];
NSEntityDescription *ed = [NSEntityDescription entityForName:@"Contact" inManagedObjectContext:self.managedObjectContext];
[fr setEntity:ed];
NSArray *ary = [self.managedObjectContext executeFetchRequest:fr error:nil];
for (Contact *cnt in ary) {
NSLog(@"%@ %@ %@ %@", cnt.passport, cnt.nickname, cnt.act.passport, cnt.act.password);
}
附圖: