2016-03-03 140 views
1

我在CoreData模型(產品和形象)兩個實體,有產品之間(一個)一個一對多的關係-images(很多)。我也分類了我的實體,我試圖從json文件填充數據庫;但是我似乎無法理解如何將圖像插入到與產品相關的圖像中,以便當我在應用程序中選擇該產品時,我會獲得所有相關圖像。值插入相關實體在CoreData

extension Products { 
    @NSManaged var price: NSNumber? 
    @NSManaged var stock: NSNumber? 
    @NSManaged var desc: String? 
    @NSManaged var name: String? 
    @NSManaged var images: NSSet? 
    @NSManaged var sales: NSSet? 
} 

extension Images { 
    @NSManaged var image: String? 
    @NSManaged var products: Products? 
} 

然後JSON文件數據(我沒有與NSJSONObjectWithData連載任何問題:

{ 「記錄」:[{ 「名」: 「蘋果iMac 27英寸」, 「描述「:」令人驚歎的一體機iMac採用美觀的27英寸Retina 5K寬屏顯示器,四核英特爾酷睿i5處理器和配備2GB GDDR5顯存的AMD Radeon R9 M380圖形處理器。「, 」image「: [「imac1.jpg」,「imac2.jpg」], 「庫存」:32, 「price」:1699.00 },{ 「名」:「蘋果iPhone 6S加128 GB」, 「說明」:「你用iPhone 6S另外的那一刻,你知道你從來沒有覺得這樣的事情。只需一次按下,3D Touch就能讓您比以往任何時候都做得更好。現場照片以非常生動的方式將您的回憶帶入生活。而這僅僅是一個開始。深入瞭解iPhone 6s Plus,您將在各個層面找到創新。「, 」image「:[」iphone6splus1.jpg「,」iphone6splus2.jpg「,」iphone6splus3.jpg「,」iphone6splus4.jpg「 ], 「股票」:144, 「價格」:1042.00 } ]}

這就是我只使用檢查數據庫爲空後,填充在AppDelegate的數據庫功能

func fillDatabase() { 
    let jsonURL = NSBundle.mainBundle().URLForResource("products", withExtension: "json"); 
    let data = NSData(contentsOfURL: jsonURL!); 
    do { 
     let jsonData = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions(rawValue: 0)) as! Dictionary<String, AnyObject>; 
     let recordset = jsonData["records"] as! Array<Dictionary<String, AnyObject>>; 
     for record in recordset { 
      let product = Products(context: managedObjectContext); 

      if let name = record["name"] { 
       product.name = name as? String; 
      } 

      if let stock = record["stock"] as? NSNumber { 
       product.stock = stock; 
      } 

      if let price = record["price"] as? Double { 
       product.price = price; 
      } 

      if let desc = record["description"] as? String { 
       product.desc = desc; 
      } 

      if let images = record["image"] as? NSMutableArray {  
       // ********************************************************* 
       // Im getting the array of images, but dont know where to go from here. 
      } 

      do { 
       try managedObjectContext.save(); 
      } catch let error as NSError { 
       print(error.debugDescription); 
      } 
     } 
    } catch let error as NSError { 
     print("error parsing json object: \(error.debugDescription)"); 
     return; 
    } 
} 

回答

1

鑑於您在Core Data中正確設置了關係,您應該能夠將i法師使用這樣的事情:

product.images = NSSet(array: imageArray) 

確保imageArray變量包含Images類型的對象。

所以總結一下,首先你需要解析數組,並從該數組創建Images產品:

var imageArray = [Images]() 

for yourRawImageFromJSON in json{ 
    let image1 = Images(context: managedObjectContext) 
    // set properties on image 
    yourImages.append(image1) 
} 

然後,一旦你有Images該數組,做像我上面(這裏將它曾說過再次完整起見):

product.images = NSSet(array: imageArray) 

旁註

您應該遵循類是在一個單一的格式命名的一般規則,所以不是使用ImagesProducts作爲你的類名,你應該使用ImageProduct。儘管一個類表示一個概括的概念(很像在數據庫系統中,其中概念類被命名爲複數形式),但使用單數形式更普遍和更方便(例如,使用let product = Product()而不是let product = Products()更簡潔,因爲後者表達了你正在實例化多個實例的想法,儘管情況顯然不是這樣)

+0

感謝您的答覆,圖像存儲爲字符串,因爲它們包含在圖像資產中。所以Images.image屬性是Model中的字符串。一個核心問題只是爲了澄清我的理解是正確的。當我有兩個實體之間的關係時,我應該在關係中輸入公共數據而不是第二個表格。因爲如果我進入「多」表,他們不會與「一」表相關的權利? – Maz

+0

我真的不知道你在說什麼......你有沒有得到我答案的基本想法? –

+0

我的意思是說,我沒有將UIImage存儲到數據庫中,我只是將文件名存儲在字符串中。我會在應用程序中將它轉換爲UIImage – Maz

0

我沒有像你在我的項目中那樣使用CoreData,但是如果代碼的其他部分按照預期工作,這應該完成這項工作。

if let images = record["image"] as? NSMutableArray {  
    for i in 0..<images.count { 
     let imageObject = Images(context: managedObjectContext) 

     imageObject.image = images[i] 

     let images = product.mutableSetValueForKey("images") 
     images.addObject(imageObject) 
    } 
} 

關於你的CoreData對象的命名我同意@the_critic,你實際上有圖像對象和產品對象。而你的產品對象有多個圖像對象。這意味着在數據模型中創建對象「圖像」的名稱和關係「圖像」的名稱可能會更好。

0

是不是一個很好的做法,在覈心數據存儲陣列,因此,這是我會怎麼做:

首先:你需要創建一個Image對象。

extension Images { /* Images+Methods */ 
     class func save(images: [NSDictionary]) -> [Images]? { 

     let imagesArray = [Images]() 
     for imageObject in images { 

      // creates a new Images NSManagedObject 
      guard let imageEntity = NSEntityDescription.insertNewObjectForEntityForName("Images", inManagedObjectContext: managedObjectContext) as? Images else { 
      return nil 
      } 

      if let image = imageObject["image"] as? String { 
      imageEntity.image = image 
      imagesArray.append(imageEntity) 
      } 
     } 
     return imagesArray 
     } 

然後,調用上一個方法的Save(images:[NSDictionary])方法。

if let images = record["image"] as? NSMutableArray { 

     // after what you already have, add the following line 
     if let images = record["images"] as? NSMutableArray, let imagesObjectArray = Images.save(images) { 
     product.images = NSSet(array:imagesObjectArray) 
     } 
    } 

這應該這樣做。因爲正在爲每個圖像創建一個圖像NSManagedObject。

希望這有助於

P.S 你真的需要改變你的類名。