2

Objective-cはかなり新しく、CoreDataは非常に新しい-この質問は途方もなく単純に感じますが、1.5時間の検索にもかかわらず、私はそれを理解できません!より大きな心を探しています。

状況: CoreDataにエンティティ( "AssetType")があり、そのエンティティに1つの属性( "label")があります。AssetTypeは、別のエンティティ( "Items")と多対多の関係にあります。アイテムはAssetTypeと1対1の関係にあり、現在、「ラベル」には「Electronics」、「Furniture」、「Jewelry」の3つの値があります。

目標:非常に簡単に言えば、すべてのオブジェクトから値の1つを削除したいと思います。「多くの」オブジェクト(eww)のforループを経由するのではなく、これをすべて一度に実行することをお勧めしますが、正直なところ、CoreDataと構文が失われているため、提供できるものはすべて素晴らしいものになります。

コード構造/背景:必要に応じてさらに貼り付けることができますが、一般的なUITableView + UINavigationItem editButtonItemを使用して編集を実行しています(重要な場合はUIPopoverController内で)-そこからdeleteメソッドが取得されます-そしてキャプチャしていますtableView:commitEditingStyle:forRowAtIndexPath:デリゲート/プロトコルメソッドを介してそれを行います。この部分は問題ではありません-私はコードをどこに置くかを知っています、私はCoreDataで迷子になっています。:(

ツイスト: AssetTypeには現在クラスがありません-これは純粋にItemクラス(およびCoreDataの別のエンティティ)のプロパティとして存在します。これはこれまで問題ありませんでしたが、属性を操作する必要がある場合(たとえば、削除)それら!)、これは私が独自のクラスを紹介する必要があるときですか?そうでないことを願っています。

皆さんありがとう!

4

2 に答える 2

2

または、実際にAssetType完全に削除する場合は、モデルに削除ルールを設定して、AssetTypebackから。への逆の関係を設定できますItem。この場合、Nullifyルールが必要なようですが、

次に、問題のオブジェクトを削除するだけで、次の保存時にそのAssetTypeオブジェクトからのすべてのリンクが自動的に無効になります。ItemsAssetType

ここに画像の説明を入力してください

// 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

明確にするために、「アセット タイプ」と「アイテム」という 2 つのエンティティがあり、多対多の関係があります。すべてのアイテムが特定のアセット タイプとの接続を同時に切断する必要があり、理想的には、アイテムを繰り返し処理したくない場合です。私はそれを手に入れましたか?

アセット タイプが本当に一意である場合 (たとえば、「家具」というラベルが付いているものは 1 つだけです)、その方法でリンクを解除することができます — Core Data の関係は常に双方向であり、一方からリンクを解除すると、もう一方からも自動的にリンクが解除されます。 . NSManagedObject サブクラスには、セット内の「to many」関係の最後にあるものを追加または削除できるアクセサーもあります。だから例えば

[furnitureObject removeItems:furnitureObject.items];

これは、アセット タイプ エンティティに、アイテムにリンクする「items」という名前の「to many」接続があることを前提としています。

それ以外の場合は、述語を実行して、文字列名 'Furniture' を持つすべてのアセットのリストを取得し、それらを反復処理できると思います。

于 2012-07-10T02:45:13.913 に答える