首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在CoreData中将值插入相关实体

在CoreData中将值插入相关实体
EN

Stack Overflow用户
提问于 2016-03-03 21:02:25
回答 3查看 1.2K关注 0票数 2

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

代码语言:javascript
复制
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序列化它没有任何问题):

{“记录”:[{“名称”:"Apple iMac 27in",“描述”:“令人震惊的全合一iMac功能包括一个漂亮的27英寸Retina 5K宽屏显示器、英特尔四核核心i5处理器和带有2GB GDDR5内存的AMD Radeon R9 M380图形处理器。”,“图像”:"imac1.jpg","imac2.jpg",“股票”:32,“价格”:1699.00 },{“名称”:"Apple iPhone 6s Plus 128 GB","description“:”当您使用iPhone 6s Plus时,您知道您从未有过这样的感觉。只要一次按压,3D触控就能让你做得比以往任何时候都多。实时照片以一种强有力的生动的方式将你的记忆带入生活。这只是个开始。深入观察iPhone 6s Plus,您将发现各个层次的创新。“、”图像“:"iphone6splus1.jpg”、"iphone6splus2.jpg“、"iphone6splus3.jpg”、"iphone6splus4.jpg“、”股票“:144、”价格“:1042.00 }}

这是在检查数据库是否为空之后,我使用的函数,用于填充AppDelegate中的数据库。

代码语言:javascript
复制
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;
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-03 21:07:19

如果您在Core数据中正确地设置了关系,那么您应该能够通过使用以下内容来关联这些图像:

代码语言:javascript
复制
product.images = NSSet(array: imageArray)

确保imageArray变量包含Images类型的对象。

总之,首先需要解析数组并从该数组创建Images产品:

代码语言:javascript
复制
var imageArray = [Images]()

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

然后,一旦您拥有了这个Images数组,就按照我前面所说的那样做(为了完整起见,再次在这里添加它):

代码语言:javascript
复制
product.images = NSSet(array: imageArray)

边注

您应该遵循类以单数格式命名的一般规则,因此不应该使用ImagesProducts作为类名,而应该使用ImageProduct__。即使一个类代表一个通用的概念(就像数据库系统中的概念类被命名为复数),使用单一形式更常见和更方便(例如,使用let product = Product()比使用let product = Products()更简洁,因为后者传递的概念是要实例化多个实例,尽管情况显然并非如此)。

票数 1
EN

Stack Overflow用户

发布于 2016-03-03 21:57:00

我并不像在我的项目中那样使用CoreData,但是如果您的代码的其他部分按预期工作,这应该可以完成任务。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2016-03-03 23:12:48

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

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

代码语言:javascript
复制
    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(图像: NSDictionary)方法。

代码语言:javascript
复制
    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。

希望这能有所帮助

你真的需要改变你的类名。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35782966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档