微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Swift-如何调试核心数据关系错误?

如何解决Swift-如何调试核心数据关系错误?

我正在创建产品的核心数据对象,该产品还具有与多对多关系相关联的许多其他产品。

转换我的json im时,请检查该产品是否具有关联的产品,然后添加关系。

if let relatedItems = response["related"] as? [[String:Any]] {
    // create the related items
    for d in relatedItems {
        let related = try createAssociatedFromresponse(response: d)
        product.addToAssociatedProducts(related)
        try self.managedobjectContext.save()
    }
}

这会产生一个不稳定的错误-由于未捕获的异常“ NSInternalInconsistencyException”而终止应用程序,原因:“不应同时修改对象和添加对象”

我尝试检查对象是否已经作为关系存在,但仍收到此错误

编辑-将json转换为核心数据对象的完整代码

func createFromresponse(response: Dictionary<String,Any>) throws -> Product {
        
        let productID = response["id"] as! NSNumber
        
        var product: Product!
        
        let fetchRequest: NSFetchRequest<Product> = Product.fetchRequest()
        fetchRequest.predicate = nspredicate(format: "productID = %@",productID)
        
        if let fetchedProduct = try self.managedobjectContext.fetch(fetchRequest).first {
            product = fetchedProduct
        } else {
            product = (NSEntityDescription.insertNewObject(forEntityName: "Product",into: self.managedobjectContext) as! Product)
            product.productID = productID
        }
        
        product.name = response["name"] as? String
        product.ref = response["ref"] as? String
        product.desc = response["description"] as? String
        product.imageURL = response["image"] as? String
        product.image = nil
        product.thumbImageURL = response["thumb"] as? String
        product.thumbImage = nil
        product.pdfURL = response["pdf"] as? String
        product.manufacturerUrl = response["manufacturer_url"] as? String
        
        if let categoriesInHierarchy = response["categories"] as? NSArray
        {
            if categoriesInHierarchy.count == 3
            {
                if let topCategory = categoriesInHierarchy[0] as? [String:Any] {
                    product.topCategoryID = topCategory["id"] as? NSNumber
                    product.topCategoryName = topCategory["name"] as? String
                }
                
                if let subCategory = categoriesInHierarchy[1] as? [String:Any] {
                    product.subCategoryID = subCategory["id"] as? NSNumber
                    product.subCategoryName = subCategory["name"] as? String
                }
                
                if let bottomCategory = categoriesInHierarchy[2] as? [String:Any] {
                    product.bottomCategoryID = bottomCategory["id"] as? NSNumber
                    product.bottomCategoryName = bottomCategory["name"] as? String
                }
                
            }
        }
        
        if let relatedItems = response["related"] as? [[String:Any]] {
            // create the related items
            for d in relatedItems {
                let related = try createAssociatedFromresponse(response: d)
                product.addToAssociatedProducts(related)
            }
            try self.managedobjectContext.save()
        }
        
        return product
    }

func createAssociatedFromresponse(response: Dictionary<String,into: self.managedobjectContext) as! Product)
            product.productID = productID
        }
        
        product.name = response["name"] as? String
        product.ref = response["ref"] as? String
        product.desc = response["description"] as? String
        product.imageURL = response["image"] as? String
        product.image = nil
        product.thumbImageURL = response["thumb"] as? String
        product.thumbImage = nil
        product.pdfURL = response["pdf"] as? String
        product.manufacturerUrl = response["manufacturer_url"] as? String
        
        if let categoriesInHierarchy = response["categories"] as? NSArray
        {
            if categoriesInHierarchy.count == 3
            {
                if let topCategory = categoriesInHierarchy[0] as? [String:Any] {
                    product.topCategoryID = topCategory["id"] as? NSNumber
                    product.topCategoryName = topCategory["name"] as? String
                }
                
                if let subCategory = categoriesInHierarchy[1] as? [String:Any] {
                    product.subCategoryID = subCategory["id"] as? NSNumber
                    product.subCategoryName = subCategory["name"] as? String
                }
                
                if let bottomCategory = categoriesInHierarchy[2] as? [String:Any] {
                    product.bottomCategoryID = bottomCategory["id"] as? NSNumber
                    product.bottomCategoryName = bottomCategory["name"] as? String
                }
                
            }
        }
        
        product.associatedProducts = nil
        
        return product
    }

解决方法

您可以将protected void RadGridIal_ItemCommand(object source,GridCommandEventArgs e) { //how to call and set the LabelOut text? } 移到for循环之后吗?

try self.managedObjectContext.save()

编辑:
您如何在if let relatedItems = response["related"] as? [[String:Any]] { // create the related items for d in relatedItems { let related = try createAssociatedFromResponse(response: d) product.addToAssociatedProducts(related) } try self.managedObjectContext.save() } 中创建对象?

编辑2:
您不应该在不同的线程中使用createAssociatedFromResponse,将函数包装在NSManagedObjectContext块中,如下所示:

perform

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。