将值插入CoreData中的相关实体

时间:2016-03-03 21:02:26

标签: ios swift core-data

我在CoreData模型(产品和图像)中有两个实体,产品之间存在一对多的关系(一个) - 图像(很多)。我还将我的实体子类化,我试图从json文件填充数据库;但我似乎无法理解如何将图像插入与产品相关的图像中,这样当我在应用程序中选择该产品时,我会得到所有相关图像。

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序列化它:

  

{“records”:[{      “名称”:“Apple iMac 27in”,      “描述”:“令人惊叹的一体化iMac采用漂亮的27英寸Retina 5K宽屏显示器,四核英特尔酷睿i5处理器和AMD Radeon R9 M380图形处理器,配备2GB GDDR5显存。”,      “image”:[“imac1.jpg”,“imac2.jpg”],      “股票”:32,      “价格”:1699.00       },      {      “名称”:“Apple iPhone 6s Plus 128 GB”,      “描述”:“你使用iPhone 6s Plus的那一刻,你知道你从来没有感觉到它。只需一次按下,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;
    }
}

3 个答案:

答案 0 :(得分:1)

鉴于您在Core Data中正确设置了关系,您应该可以使用以下内容关联图像:

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)

旁注

您应该遵循以单数格式命名类的一般规则,因此您应该使用Images而不是使用ProductsImage作为您的类名称和Product。尽管一个类表示一个通用概念(很像在数据库系统中,概念类被命名为多个),但使用单数形式更常见且更方便(例如,它更简洁使用let product = Product()而不是let product = Products(),因为后者传达了您实例化多个实例的概念,即使事实并非如此)

答案 1 :(得分: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,你实际上有图像对象和产品对象。并且您的产品对象具有多个图像对象。这意味着制作对象的名称&#34; image&#34;和关系的名称&#34;图像&#34;在您的数据模型中可能会好得多。

答案 2 :(得分:0)

将数组存储在核心数据中不是一个好习惯,因此,我会这样做:

首先:您需要创建一个图像对象。

    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 你真的需要改变你的班级名称。