繁体   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