簡體   English   中英

需要有關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管理對象,並且您想要學習如何使用訪問者。 完成后,您將能夠更好地學習如何進行提取。

老實說,我建議將你的項目放在一邊,然后瀏覽iPhoneCore Data Tutorial

如果要在NSManagedObject子類上調用類似“-addCatagoryObject:”的方法,則必須在實際的.m文件中包含該方法的代碼 - 它不是在運行時生成的。

但是,它可以由Xcode半自動生成 - 查找允許您在Xcode中復制方法定義和實現的各種菜單項。

現在大多數人都跳過這些,你不需要調用-addCategoryObject:,你可以讓運行時為你生成訪問者代碼。

首先,您的變量名稱(在標題和模型中)應該是“類別”,而不是“類別”,因為它代表一個集合,而不是單個。

然后,您可以使用以下內容將類別設置為您想要的任何集合:

restaurant.categories = [NSSet setWithObjects:category1, category2, nil];

如何使用不同的值設置我的餐廳Catagory? 然后我該如何取回它們?

最好的辦法是瀏覽iPhone核心數據教程 ,了解如何添加實體類型的新托管對象實例(在您的情況下,“餐廳”),設置該實例的屬性(例如,“Restaurant.category”) “)並獲取結果。

本教程使用名為“Event”的實體類型,它具有日期和位置屬性,但這些想法都是相同的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM