2016-03-03 54 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 你真的需要改变你的类名。