我在目前的项目中遇到了障碍。我基本上有一个类似核心数据食谱应用程序的应用程序... 这是我在.xcdatamodel
中的基本结构实体:餐厅 字符串:名称 类别:类别< ---- to-many relationship
实体:类别 字符串:名称 餐厅:餐厅< ---- to-many relationship 所以基本上,餐厅可以有多个类别...... 并且有一些const预定义的类别.. 例如: 餐厅: 名称:辣椒 分类:外出,家庭用餐
“外卖”和“家庭用餐”是10种不同的餐厅类别中的2种。 我该如何做...我已经查看了sqllite数据库,我有我的ZRestaurant和ZCategory表+两者的连接表......我有两个数据......
如何使用不同的值设置我的餐厅Catagory?然后我该如何取回它们?
谢谢大家! 库尔特
答案 0 :(得分:5)
好的,在过去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
答案 1 :(得分:4)
你会想要做这样的事情,而不是:
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。
答案 2 :(得分:4)
如果要在NSManagedObject子类上调用类似“-addCatagoryObject:”的方法,则必须在实际的.m文件中包含该方法的代码 - 它不是在运行时生成的。
但是,它可以由Xcode半自动生成 - 查找允许您在Xcode中复制方法定义和实现的各种菜单项。
现在大多数人都跳过这些,你不需要调用-addCategoryObject:,你可以让运行时为你生成访问代码。
首先,您的变量名称(在标题和模型中)应该是“类别”,而不是“类别”,因为它代表一个集合,而不是单个。
然后,您可以使用以下内容将类别设置为您想要的任何设置:
restaurant.categories = [NSSet setWithObjects:category1, category2, nil];
答案 3 :(得分:0)
如何使用不同的值设置我的餐厅Catagory?然后我该如何取回它们?
最好的办法是浏览Core Data Tutorial for iPhone,其中介绍如何添加实体类型的新托管对象实例(在您的情况下为“餐厅”),设置该实例的属性(例如,“ Restaurant.category“)并获取结果。
本教程使用名为“Event”的实体类型,该类型具有日期和位置属性,但这些想法都是相同的。