2016-12-04 5 views
0

私は対多の関係が私のデータモデル内の私のエンティティPersonListItemlistItemsと呼ばれる追加し、その後に成功selectedListItemsは型のオブジェクトの配列です関係を介してアクセスできるmutableArrayValueを作成するにはどうすればよいですか?

let personSelectedListItems = person.mutableSetValue(forKey: "listItems") 
    personSelectedListItems.addObjects(from: selectedListItems) 
    print("personSelectedListItems after addObjects contains \(personSelectedListItems)") 

を使用して、指定されたPersonにオブジェクトを追加しましたListItem。私は、各Person用に作成されたこれらのオブジェクトを持つようにしたいので

personSelectedListItems after addObjects contains Relationship 'listItems' on managed object (0x6080000d2050) <PersonMO: 0x6080000d2050> (entity: Person; id: 0xd000000000040002 <x-coredata://1350DE85-4F65-462A-9C36-1EEE3D5298CD/Person/p1> ; data: { 
    age = Ky; 
    firstName = Uykyu; 
    image = <89504e47 0d0a1a0a 0000000d 49484452 000002cc 00000333 08020000 003d00d3 35000000 01735247 4200aece 1ce90000 001c>; 
    isVisited = 0; 
    lastName = Kuyuy; 
    listItems =  (
     "0xd000000005140000 <x-coredata://1350DE85-4F65-462A-9C36-1EEE3D5298CD/ListItem/p325>", 
     "0xd000000005680000 <x-coredata://1350DE85-4F65-462A-9C36-1EEE3D5298CD/ListItem/p346>", 
     "0xd0000000023c0000 <x-coredata://1350DE85-4F65-462A-9C36-1EEE3D5298CD/ListItem/p143>" 
    ); 
    locationCity = Uyk; 
    locationState = You; 
    notes = ""; 
    phoneNumber = ""; 
    score = nil; 
}) with objects {(
    <ListItemMO: 0x6000000b6c20> (entity: ListItem; id: 0xd000000005140000 <x-coredata://1350DE85-4F65-462A-9C36-1EEE3D5298CD/ListItem/p325> ; data: { 
    category = Meta; 
    isSelected = 1; 
    listItem = "Similar values"; 
    listItemStatus = 1; 
    listItemWeight = 1; 
    people =  (
     "0xd000000000040002 <x-coredata://1350DE85-4F65-462A-9C36-1EEE3D5298CD/Person/p1>" 
    ); 
}), 
    <ListItemMO: 0x6000000af900> (entity: ListItem; id: 0xd000000000080000 <x-coredata://1350DE85-4F65-462A-9C36-1EEE3D5298CD/ListItem/p2> ; data: { 
    category = Appearance; 
    isSelected = 1; 
    listItem = Attractive; 
    listItemStatus = 3; 
    listItemWeight = 1; 
    people =  (
     "0xd000000000040002 <x-coredata://1350DE85-4F65-462A-9C36-1EEE3D5298CD/Person/p1>" 
    ); 
}), 
    <ListItemMO: 0x6000000b27e0> (entity: ListItem; id: 0xd0000000023c0000 <x-coredata://1350DE85-4F65-462A-9C36-1EEE3D5298CD/ListItem/p143> ; data: { 
    category = Behavior; 
    isSelected = 1; 
    listItem = "Good grammar"; 
    listItemStatus = 1; 
    listItemWeight = 1; 
    people =  (
     "0xd000000000040002 <x-coredata://1350DE85-4F65-462A-9C36-1EEE3D5298CD/Person/p1>" 
    ); 
}) 
)} 

これは、良いですが、それは私が一見アクセスすることはできませんよ順不同セットだから、それは悪いです:print文を提供します。私は、インデックスの各オブジェクトにアクセスできるように、それは可変配列であるために私がたいが、私は

let personSelectedListItems = person.mutableArrayValue(forKey: "listItems") 
    personSelectedListItems.addObjects(from: selectedListItems) 
    print("personSelectedListItems after addObjects contains \(personSelectedListItems)") 

を行うとき、私は、このエラーメッセージが出ます:以来、

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'NSManagedObjects of entity 'Person' do not support -mutableArrayValueForKey: for the property 'listItems'' 

不可解されますmutableSetValueForKey:がサポートされていたが、配列バージョンがサポートされていなかった理由はわかりません。理想的にはドット表記を使って、関係を通してオブジェクトにアクセスできるようにしたいと思っています。これについて最善の方法は何ですか?

+0

モデルに順序付けされた関係を設定しましたか? – Wain

+0

@Wain私は元々、そのセットを持っていなかった、チップのおかげで!私は 'ordered'ボックスをチェックして、関係を 'mutableOrderedSetValue'に変更しました。'(person.listItems?.object(at:0)) 'を実行すると、私に正しいオブジェクトが与えられました。私が執着しているのは、そのオブジェクトの属性にアクセスすることです。これをどうやって行うことができますか? – MachTurtle

答えて

0

@Wainと@TomHarringtonの両方が、この上の正しい方向に私を指摘したが、ここでは(いくつかの検索と工夫の後に)私の質問への答えが何であったかです:

まず第一に、私はにをマークするために必要な私のデータ・モデル・ファイルのデータ・モデル・インスペクタで「順序付け」された数多くの関係があります。 2つ目はmutableOrderedSetValueは関係の注文の性質を反映するように

let personSelectedListItems = person.mutableOrderedSetValue(forKey: "listItems") 
personSelectedListItems.addObjects(from: selectedListItems) 
print("personSelectedListItems after addObjects contains \(personSelectedListItems)") 

let personSelectedListItems = person.mutableSetValue(forKey: "listItems") 
personSelectedListItems.addObjects(from: selectedListItems) 
print("personSelectedListItems after addObjects contains \(personSelectedListItems)") 

を変更することでした。その後、私は順番に返されたセットを持っていました。ハレイ!しかし、今私はどのように私はこれらの個々のオブジェクトにその関係を通してアクセスして変更するのですか?それは私を3番目のものにしてくれます。私はクラスをクラスにダウンキャストしなければなりませんでした(ListItemMO)。順序付きセットの最初のオブジェクトを取得して関係を介してプロパティを変更するには、次のようになります。

if let listItemSet = personVar.listItems?.object(at: 0) as? ListItemMO { 
     listItemSet.listItemStatus = 0 
    } 
0

コアのデータと多対多の関係は、です。常にがセットで表されます。これに対するサポートの一部は、NSManagedObjectmutableSetValue(forKey:)を実装していることです。これは、関係にアクセスするための文書化された方法の1つです。多対多の関係はセットなので、NSManagedObjectmutableArrayValue(forKey:)をサポートしていません。そのエラーメッセージに示されています。

順序関係を使用する場合は、データモデルエディタで注文した通りにマークしてから、NSOrderedSetを使用します。まだ配列ではありませんが、順序はあります。

+0

情報に感謝します!関係を介してmutableSetValue内のオブジェクトにアクセスするにはどうすればよいですか? – MachTurtle

+0

私は '(person.listItems?.object(at:0))'が私に興味のあるオブジェクトを正しく与えていますが、その属性にアクセスするのに問題があります。コメント。 – MachTurtle

関連する問題