CoreData雙向關系/刪除規則


雙向關系

雙向的時候,只用指定一邊,另外一邊自動指定,比如,如果一個帳號只有一個聯系人,而一個聯系人對應一個帳號的話,那么帳號表和聯系人表就是一一對應的關系,將他們指定為雙向的,如下面將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);
}

附圖:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM