首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在处理iPhone核心数据中的多对多关系方面需要帮助

在处理iPhone核心数据中的多对多关系方面需要帮助
EN

Stack Overflow用户
提问于 2009-09-19 21:07:20
回答 4查看 9.3K关注 0票数 6

我在目前的项目中遇到了一个障碍。我基本上有一个应用程序,它很像核心数据食谱应用程序...下面是我的.xcdatamodel中的基本结构

实体:餐厅字符串:名称类别:类别<-多对关系

Entity: Category String: name Restaurant: restaurant <-多对多关系所以基本上,一个餐厅可以有多个类别...并且有一定数量的预定义类别。例如:餐厅:名称:辣椒的类别:外卖,家庭用餐

“外卖”和“家庭用餐”是10种不同的餐馆类别中的2种。我该怎么做呢..我已经查看了sqllite数据库,我有我的ZRestaurant和ZCategory表+它们的连接表……我在这两个地方都有数据。

如何使用不同的值设置我的餐厅目录?那我怎么把它们取回来呢?

谢谢大家!库尔特

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-09-22 17:02:38

好的,经过过去两天的工作,我终于想出了我的解决方案,实际上是Alex和Wills建议的混合……谢谢你们两位!

这是我的资料..。

代码语言:javascript
复制
 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]];

然后我像这样存钱

代码语言:javascript
复制
- (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

票数 5
EN

Stack Overflow用户

发布于 2009-09-19 22:24:02

相反,您可能想要这样做:

代码语言:javascript
复制
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托管对象,并且希望了解如何使用访问器。一旦你做到了这一点,你将能够更好地学习如何进行抓取。

老实说,我建议把你的项目放在一边,通过Core Data Tutorial for iPhone

票数 4
EN

Stack Overflow用户

发布于 2009-09-20 02:32:31

如果要在NSManagedObject子类上调用类似"-addCatagoryObject:“的方法,则必须在实际的.m文件中包含该方法的代码-它不是在运行时生成的。

但是,它可以由Xcode半自动生成-查找各种菜单项,这些菜单项允许您在Xcode中复制方法定义和实现。

现在大多数人会跳过这些,你不需要调用-addCategoryObject:,你可以让运行时为你生成访问器代码。

首先,您的变量名称(在头部和模型中)应该是“类别”,而不是“类别”,因为它表示一个集合,而不是一个单例。

然后,您可以使用以下命令将类别设置为您想要的任何集合:

代码语言:javascript
复制
restaurant.categories = [NSSet setWithObjects:category1, category2, nil];
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1449523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档