2017-06-12 10 views
0

私は、2つの属性asset_tagとlocationを持つDeviceというエンティティでコアデータスタックを設定しました。私はこのように設定した2つの配列があります。これは、追加Core Data Swift 3に2行のデータを挿入します

let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext 

    for device in assetTag { 

     let newArray = NSEntityDescription.insertNewObject(forEntityName: "Device", into: context) 

     newArray.setValue(device, forKey: "asset_tag") 
    } 

var assetTag = ["53","35","26","42","12"] 
var location = ["SC", "FL", "NA", "NY", "CF"] 

を自分のコードの最初の部分は、最初の配列をループして、このようなasset_tag属性にそれぞれ番号を追加しますそれぞれの値を配列に渡すので、後でそれらを出力することができ、これは完全に機能します。 2番目の配列で同じことをして2番目の属性に追加したいのですが、試しても正しくデータが追加されません。これは私が持っているものです。私は結果をプリントアウトするとき

for locations in location { 

      let secondArray = NSEntityDescription.insertNewObject(forEntityName: "Device", into: context) 

      secondArray.setValue(locations, forKey: "location") 

     } 

、私はnill値の束を得る:

[<Device: 0x600000281130> (entity: Device; id: 0xd000000001580000 <x-coredata://22AC91EB-92B1-4E5B-A5A9-A5924E0ADD3E/Device/p86> ; data: { 
    "asset_tag" = nil; 
    devices = nil; 
    location = CF; 
}), <Device: 0x60000009f040> (entity: Device; id: 0xd0000000015c0000 <x-coredata://22AC91EB-92B1-4E5B-A5A9-A5924E0ADD3E/Device/p87> ; data: { 
    "asset_tag" = 53; 
    devices = nil; 
    location = nil; 
}), <Device: 0x6000002810e0> (entity: Device; id: 0xd000000001600000 <x-coredata://22AC91EB-92B1-4E5B-A5A9-A5924E0ADD3E/Device/p88> ; data: { 
    "asset_tag" = nil; 
    devices = nil; 
    location = NY; 

私はそれらのNILSがどこから来ていることを確認していません。

EDIT:

良く見えますが、私はNILSを持つデバイスと呼ばれる別の属性取得しています:また、私は上記のようなコア・データ、の順で結果をプリントアウトするとき

"asset_tag" = 12; 
    devices = nil; 
    location = CF; 

を値は配列を定義した順序と同じではありません。

"asset_tag" = 12; 
    devices = nil; 
    location = CF; 

    "asset_tag" = 53; 
    devices = nil; 
    location = SC; 

上記の結果は、12と53とCFとSCを示していますが、セットアップされた元のアレイとは異なる順序です。

答えて

1

2つの属性を持つ5つのインスタンスを作成する必要があります。あなたのコードは10の異なるインスタンスを作成します。コアデータエンティティは、複数のプロパティを持つクラスに似ています。

解決策は、インデックスベースのループを使用して両方の属性を割り当てることです。

newArrayではなく、Core Dataインスタンスの名前をdeviceとしています。次のコードでは、配列を使用してインスタンスを保持しています。

assert行は、両方の配列に同じ数の項目が含まれているかどうかを確認する行です。

var devices = [Device]() 

let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext 

assert(assetTag.count == location.count, "Both arrays must have the same number of items") 
for i in 0..<assetTag.count { 

    let device = NSEntityDescription.insertNewObject(forEntityName: "Device", into: context) as! Device 

    device.asset_tag = assetTag[i] 
    device.location = location[i] 
    devices.append(device) 
} 

サイドノート:コアデータモデルに非オプションとしての価値を持つことになっている

宣言文字列属性。

+0

オリジナルの投稿に編集を追加しましたが、まだいくつかの問題があります。また、私はdevice.asset_tagを使用することができませんが、私はXcodeで管理対象オブジェクトのサブクラスを作成しました。なぜ私がdevice.asset_tagを使用させないのかわからないのですが、 – Martheli

+0

'devices'は属性を設定しないため' nil'です。リピートループで 'asset_tag'と' location'の属性のみを設定していることに注意してください。コレクションはデフォルトで順序付けされていません。フェッチ要求でオブジェクトを読み込むと、ソート記述子を渡して特定の順序を強制することができます。私はその属性にドット記法を使用できるように答えを更新しました。 – vadian

+0

しかし、デバイスは私のデータモデルの属性ではありません。どこから来たのかわかりません。 – Martheli

関連する問題