![](/img/trans.png)
[英]addObject for one/many-to-many relationships in core data for iPhone
[英]Need help with many-to-many relationships in core data for iPhone
我在目前的項目中遇到了障礙。 我基本上有一個類似於Core Data Recipe應用程序的應用程序...這是我在.xcdatamodel中的基本結構
實體:餐廳字符串:名稱類別:類別<---- to-many relationship
實體:類別字符串:名稱餐廳:餐廳<---- to-many relationship所以基本上,餐廳可以有多個類別......並且有一些const預定義的類別..例如:餐廳:名稱:辣椒的分類:外賣,家庭用餐
“Take out”和“Family Dining”是10種不同的餐廳類別中的2種。 我該怎么做呢...我看了sqllite數據庫,我有我的ZRestaurant和ZCategory表+兩者的連接表...我有兩個數據...
如何使用不同的值設置我的餐廳Catagory? 然后我該如何取回它們?
謝謝大家! 庫爾特
好的,在這2天的工作之后,我終於找到了我的解決方案,這實際上是Alex和Wills建議之間的混合......謝謝你們兩位!
這是我的......
NSManagedObjectContext *context = [restaurant managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:[NSEntityDescription entityForName:@"Category" inManagedObjectContext:context]];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:&sortDescriptor count:1];
[fetchRequest setSortDescriptors:sortDescriptors];
NSError *error = nil;
NSArray *possibleCategories = [context executeFetchRequest:fetchRequest error:&error];
categoryArray = [[NSMutableArray alloc] initWithArray:possibleCategories];
currentCategories = [restaurant valueForKeyPath:@"categories"];
[restaurant addCategoriesObject:(Category *)[possibleCategories objectAtIndex:15 ]];
[currentCategories addObject:(Category*)[categoryArray objectAtIndex:15]];
然后我像這樣保存
- (void)save{
NSLog(@"EditCatagoriesTableViewController - save");
NSSet* myCategorySet = [[NSSet alloc] initWithSet:currentCategories];
NSError *error = nil;
[restaurant addCategories:myCategorySet];
error = nil;
if (![restaurant.managedObjectContext save:&error]) {
// Handle error
NSLog(@"restaurant - Unresolved error %@, %@", error, [error userInfo]);
exit(-1); // Fail
}
}
就是這樣!
非常感謝你的幫助!
-Kurt
你會想做這樣的事情,而不是:
Restaurant *mcDonalds = (Restaurant *)[NSEntityDescription insertNewObjectForEntityForName:@"Restaurant" inManagedObjectContext:managedObjectContext];
mcDonalds.name = @"McDonalds";
Restaurant *inNOut = (Restaurant *)[NSEntityDescription insertNewObjectForEntityForName:@"Restaurant" inManagedObjectContext:managedObjectContext];
inNOut.name = @"In-N-Out";
Category *driveThru = (Category *)[NSEntityDescription insertNewObjectForEntityForName:@"Category" inManagedObjectContext:managedObjectContext];
driveThru.name = @"Drive Thru to Go";
Category *sitDown = (Category *)[NSEntityDescription insertNewObjectForEntityForName:@"Category" inManagedObjectContext:managedObjectContext];
sitDown.name = @"Sit Down and Eat";
// make NSSet* of Category objects
NSSet *fastFood = [NSSet setWithObjects:driveThru, sitDown, nil];
// set Restaurant instances' categories ("to-many") property
mcDonalds.categories = fastFood;
inNOut.categories = fastFood;
// save changes to managedObjectContext...
NSError *error = nil;
if ([managedObjectContext save:&error]) {
// handle save error
}
您沒有正確實例化您的Category
管理對象,並且您想要學習如何使用訪問者。 完成后,您將能夠更好地學習如何進行提取。
老實說,我建議將你的項目放在一邊,然后瀏覽iPhone的Core Data Tutorial 。
如果要在NSManagedObject子類上調用類似“-addCatagoryObject:”的方法,則必須在實際的.m文件中包含該方法的代碼 - 它不是在運行時生成的。
但是,它可以由Xcode半自動生成 - 查找允許您在Xcode中復制方法定義和實現的各種菜單項。
現在大多數人都跳過這些,你不需要調用-addCategoryObject:,你可以讓運行時為你生成訪問者代碼。
首先,您的變量名稱(在標題和模型中)應該是“類別”,而不是“類別”,因為它代表一個集合,而不是單個。
然后,您可以使用以下內容將類別設置為您想要的任何集合:
restaurant.categories = [NSSet setWithObjects:category1, category2, nil];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.