Objective c 目标-C/iOS:如何删除';价值观';从CoreData中的属性?

Objective c 目标-C/iOS:如何删除';价值观';从CoreData中的属性?,objective-c,ios,ios5,core-data,ios5.1,Objective C,Ios,Ios5,Core Data,Ios5.1,对于objective-c和CoreData来说都是非常新的-这个问题感觉简单得可笑,但尽管搜索了1.5个小时,我还是搞不懂!寻找更伟大的头脑 情况:在CoreData中有一个实体(“资产类型”),该实体有一个属性(“标签”)。资产类型与另一个实体(“项目”)有一对多关系。项目与资产类型之间存在一对一的关系“标签”目前有3个可能的值——“电子产品”、“家具”、“珠宝” 目标:非常简单,我想从所有对象中删除其中一个值。我更希望这是一次完成的,而不是通过“多”对象(eww)上的for循环,但说实话,

对于objective-c和CoreData来说都是非常新的-这个问题感觉简单得可笑,但尽管搜索了1.5个小时,我还是搞不懂!寻找更伟大的头脑

情况:在CoreData中有一个实体(“资产类型”),该实体有一个属性(“标签”)。资产类型与另一个实体(“项目”)有一对多关系。项目与资产类型之间存在一对一的关系“标签”目前有3个可能的值——“电子产品”、“家具”、“珠宝”

目标:非常简单,我想从所有对象中删除其中一个值。我更希望这是一次完成的,而不是通过“多”对象(eww)上的for循环,但说实话,我只是对CoreData和语法感到迷茫,所以无论你能提供什么都会很棒

代码结构/背景:如果需要,我可以粘贴更多内容,但我使用通用的UITableView+UINavigationItem editButtonItem来执行编辑(在UIPopoverController中,如果需要的话)-这就是delete方法的来源-我通过tableView:committeeditingstyle:forRowAtIndexPath:delegate/protocol方法捕获它。这部分不是问题所在-我知道将代码放在哪里,我只是在CoreData中迷失了方向:(

twist:AssetType当前没有类-它在Item类(以及CoreData中的一个单独实体)中纯粹作为属性存在,到目前为止还没有问题。但是,当我需要操作属性(例如删除它们!)时,可能需要引入它自己的类?希望不是这样


谢谢大家!

请澄清:您有两个实体,“资产类型”和“项目”,它们有多对多的关系。您希望所有项目同时切断与特定资产类型的连接,理想情况下,您不希望迭代项目。我明白了吗

如果您的资产类型确实是唯一的(例如,有一种资产的标签是“家具”)然后,您可以通过这种方式取消链接-核心数据中的关系始终是双向的,从一端取消链接会自动从另一端取消链接。NSManagedObject子类还具有访问器,可以在集合中的“到多”关系末尾添加或删除内容

[furnitureObject removeItems:furnitureObject.items];
这是假设您的资产类型实体具有名为“items”的“多对多”连接,该连接链接到项目


否则,您可以运行一个谓词来获取字符串名为“Furniture”的所有资产的列表,并对这些资产进行迭代。

或者,如果您真的想删除
资产类型
,您可以在模型中为
资产类型
返回到
项目
的反向关系设置一个删除规则。在这种情况下,听起来您可能需要一个
null
规则

然后,您只需删除有问题的
AssetType
对象,该对象将在下次保存时自动使
Items
中具有该
AssetType
的所有链接无效

// Get descriptions of our entities so we can create some.
NSEntityDescription *assetTypeEntityDescription = [NSEntityDescription entityForName:@"AssetType" inManagedObjectContext:self.managedObjectContext];
NSEntityDescription *itemEntityDescription = [NSEntityDescription entityForName:@"Item" inManagedObjectContext:self.managedObjectContext];

// Create some asset types
AssetType *furnitureAssetType = [[AssetType alloc] initWithEntity:assetTypeEntityDescription insertIntoManagedObjectContext:self.managedObjectContext];
AssetType *electronicsAssetType = [[AssetType alloc] initWithEntity:assetTypeEntityDescription insertIntoManagedObjectContext:self.managedObjectContext];
AssetType *jewelryAssetType = [[AssetType alloc] initWithEntity:assetTypeEntityDescription insertIntoManagedObjectContext:self.managedObjectContext];

furnitureAssetType.label = @"Furniture";
electronicsAssetType.label = @"Electronics";
jewelryAssetType.label = @"Jewelry";

// Create some items
Item *item1 = [[Item alloc] initWithEntity:itemEntityDescription insertIntoManagedObjectContext:self.managedObjectContext];
item1.assetType = furnitureAssetType;

Item *item2 = [[Item alloc] initWithEntity:itemEntityDescription insertIntoManagedObjectContext:self.managedObjectContext];
item2.assetType = electronicsAssetType;

Item *item3 = [[Item alloc] initWithEntity:itemEntityDescription insertIntoManagedObjectContext:self.managedObjectContext];
item3.assetType = jewelryAssetType;

[self.managedObjectContext save:nil];

NSLog(@"item1 asset type is:%@", item1.assetType.label);
// Output: item1 asset type is:Furniture

// Delete the furniture asset type
[self.managedObjectContext deleteObject:furnitureAssetType];

NSLog(@"item1 asset type is:%@", item1.assetType.label);
// Output: item1 asset type is:Furniture

// Save the changes..
[self.managedObjectContext save:nil];    

NSLog(@"item1 asset type is:%@", item1.assetType.label);
// Output: item1 asset type is:(null)
// Because of the delete rule when the furniture object is deleted relationships that pointed to it are nulled out.  
// The furniture asset type no longer exists.  
// There are now only 2 asset types in the persistent store.


谢谢Tommy-你明白了,除了项目与资产类型是一对一的关系(项目只能有一种资产类型),但是资产类型是对多的(我可能有5种不同的项目,它们都是“计算机”资产类型)。这会改变解决方案吗?不应该,除非目标是删除具有特定资产类型的所有项目,而不仅仅是切断与该资产类型的链接?不-目标只是完全删除资产类型(因此,在设置项目1的资产类型时,如果删除资产类型6,则删除并删除所有项目的资产类型)。我无法使上述方法正常工作(编译器错误)…我将继续查找。哪些代码片段有助于更清楚地概述我正在进行的工作?这感觉好像涉及了很多代码,因此我不想粘贴到整个项目中。。)此外,我在上面添加了一个“twist”,它概括了我昨晚忘记的一个细节——以防万一,谢谢rory——因此听起来好像我要创建一个NSEntityDescription实体(本例中为AssetType),然后为同一实体(AssetType)设置一个nsrrelationshipDescription,然后删除与“label”属性关联的一个值。。但我首先应该如何删除该值(例如“家具”)?不幸的是,我被困在这个过程的基本知识上我添加了示例代码和模型来说明这一点。在本例中,我使用模型编辑器(推荐!)构建了我的模型,并从模型
编辑器->创建NSManagedObject子类中生成了子类。
因此我可以使用属性和类型名称等,就像您添加的twist一样。假设您的意思是您有一个
资产类型
实体,但当用户选择标签文本并将其设置为
上的字符串属性时,您只是从中抓取标签文本?,那么,是的,您需要如上所示的适当关系,以利用此处以及Tommy的替代方法中显示的核心数据的自动功能(该方法可获得类似的结果,但不会删除
资产类型
)。谢谢,rory,这非常有帮助。问题:目前,我只在
didEnterBackground
上保存-我是否需要在整个应用程序中包含更多的保存?或者CoreData是否允许我在内存中处理此问题-例如,如果我使用上述方法删除标签,我是否能够使用
deleteRowsAtIndexPaths:withRowAnimation:
重新绘制UITableView?i、 e.如果我有6个资产类型,然后使用上面的方法删除一个,表会知道现在只有5个吗?我假设是的,因为我现在甚至可以在不执行CoreData保存的情况下添加标签。(值得一提的是,在没有专用AssetType类的情况下使用您的方法将一直有效,直到在
deleteRowsAtIndexPaths:withRowAnimation: