2

Objective-c 非常新,CoreData 非常新 - 这个问题感觉非常简单,但尽管搜索了 1.5 小时,我还是无法弄清楚!寻找更伟大的思想。

情况: CoreData 中有一个实体(“AssetType”),并且该实体有一个属性(“标签”)。AssetType与另一个实体(“项目”)具有一对多关系。Items与 AssetType具有一对一的关系,“label”当前可能有 3 个值 - “Electronics”、“Furniture”、“Jewelry”。

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

代码结构/背景:如果需要,我可以粘贴更多内容,但我使用通用 UITableView + UINavigationItem editButtonItem 来执行编辑(如果重要,在 UIPopoverController 内) - 这就是删除方法的来源 - 我正在捕获它通过 tableView:commitEditingStyle:forRowAtIndexPath: 委托/协议方法。这部分不是问题——我知道把代码放在哪里,我只是迷失在 CoreData 中。:(

扭曲: AssetType 目前没有一个类 - 它纯粹作为 Item 类中的一个属性(以及 CoreData 中的一个单独实体)存在,到目前为止一直很好.. 但也许当我需要操纵属性时(例如删除他们!),这是我需要介绍自己的课程的时候吗?希望不是这样。

谢谢大家!

4

2 回答 2

2

或者,如果您真的想AssetType完全删除,您可以在模型中为从AssetTypeback 到的反向关系设置删除规则Item。在这种情况下,听起来你想要一个Nullify规则,

然后,您只需删除有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.
于 2012-07-10T12:51:27.307 回答
0

需要明确一点:您有两个实体,“资产类型”和“项目”,它们具有多对多关系。您希望所有项目同时切断与特定资产类型的连接,理想情况下,您不希望遍历项目。我得到了吗?

如果您的资产类型确实是独一无二的(例如,恰好有一个带有“家具”标签),那么您可以直接取消链接——Core Data 中的关系始终是双向的,并且从一侧取消链接会自动从另一侧取消链接. NSManagedObject 子类还具有访问器,可以在集合中的“对多”关系的末尾添加或删除事物。所以例如

[furnitureObject removeItems:furnitureObject.items];

这是假设您的资产类型实体有一个名为“items”的“to many”连接,该连接链接到项目。

否则,您可以运行一个谓词来获取字符串名称为“家具”的所有资产的列表,并遍历这些资产,我猜。

于 2012-07-10T02:45:13.913 回答