Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift-如何调试核心数据关系错误?_Ios_Swift_Iphone_Core Data - Fatal编程技术网

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

Ios Swift-如何调试核心数据关系错误?,ios,swift,iphone,core-data,Ios,Swift,Iphone,Core Data,我正在创建一个产品的核心数据对象,该产品还具有多对多关系中与其关联的许多其他产品 if let relatedItems = response["related"] as? [[String:Any]] { // create the related items for d in relatedItems { let related = try createAssociatedFromResponse(response: d)

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

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()
    }
}
转换json时,我会检查该产品是否有关联的产品,然后添加关系

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, 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
                }
                
            }
        }
        
        product.associatedProducts = nil
        
        return product
    }
func createFromResponse(响应:Dictionary)抛出->产品{
让productID=response[“id”]作为!NSNumber
var产品:产品!
let fetchRequest:NSFetchRequest=Product.fetchRequest()
fetchRequest.predicate=NSPredicate(格式:“productID=%@”,productID)
如果让fetchedProduct=尝试self.managedObjectContext.fetch(fetchRequest).first{
product=fetchedProduct
}否则{
product=(NSEntityDescription.insertNewObject(forEntityName:“product”,插入:self.managedObjectContext)作为!product)
product.productID=productID
}
product.name=响应[“name”]为?字符串
product.ref=响应[“ref”]为?字符串
product.desc=响应[“描述”]为?字符串
product.imageURL=响应[“图像”]为?字符串
product.image=nil
product.thumbImageURL=响应[“thumb”]为?字符串
product.thumbImage=nil
product.pdfURL=响应[“pdf”]为?字符串
product.manufacturerUrl=响应[“制造商url”]为?字符串
如果让categoriesInHierarchy=响应[“categories”]为?NSArray
{
如果categoriesInHierarchy.count==3
{
如果让topCategory=categoriesInHierarchy[0]作为?[String:Any]{
product.topCategoryID=topCategory[“id”]作为?NSNumber
product.topCategoryName=topCategory[“名称”]作为?字符串
}
如果let subCategory=categoriesInHierarchy[1]为?[String:Any]{
product.subCategory id=子类别[“id”]作为?NSNumber
product.subCategory name=子类别[“名称”]作为?字符串
}
如果让bottomCategory=categoriesInHierarchy[2]作为?[String:Any]{
product.bottomCategoryID=bottomCategory[“id”]作为?NSNumber
product.bottomCategoryName=bottomCategory[“name”]作为?字符串
}
}
}
如果让relatedItems=response[“related”]as?[[String:Any]]{
//创建相关项目
对于相关项目中的d{
let related=尝试createAssociatedFromResponse(响应:d)
产品。添加到关联产品(相关)
}
请尝试self.managedObjectContext.save()
}
退货
}
func createAssociatedFromResponse(响应:字典)抛出->产品{
让productID=response[“id”]作为!NSNumber
var产品:产品!
let fetchRequest:NSFetchRequest=Product.fetchRequest()
fetchRequest.predicate=NSPredicate(格式:“productID=%@”,productID)
如果让fetchedProduct=尝试self.managedObjectContext.fetch(fetchRequest).first{
product=fetchedProduct
}否则{
product=(NSEntityDescription.insertNewObject(forEntityName:“product”,插入:self.managedObjectContext)作为!product)
product.productID=productID
}
product.name=响应[“name”]为?字符串
product.ref=响应[“ref”]为?字符串
product.desc=响应[“描述”]为?字符串
product.imageURL=响应[“图像”]为?字符串
product.image=nil
product.thumbImageURL=响应[“thumb”]为?字符串
product.thumbImage=nil
product.pdfURL=响应[“pdf”]为?字符串
product.manufacturerUrl=响应[“制造商url”]为?字符串
如果让categoriesInHierarchy=响应[“categories”]为?NSArray
{
如果categoriesInHierarchy.count==3
{
如果让topCategory=categoriesInHierarchy[0]作为?[String:Any]{
product.topCategoryID=topCategory[“id”]作为?NSNumber
product.topCategoryName=topCategory[“名称”]作为?字符串
}
如果let subCategory=categoriesInHierarchy[1]为?[String:Any]{
product.subCategory id=子类别[“id”]作为?NSNumber
product.subCategory name=子类别[“名称”]作为?字符串
}
如果让bottomCategory=categoriesInHierarchy[2]作为?[String:Any]{
product.bottomCategoryID=bottomCategory[“id”]作为?NSNumber
product.bottomCategoryName=bottomCategory[“name”]作为?字符串
}
}
}
product.associatedProducts=零
退货
}

在for循环之后,可以移动
try self.managedObjectContext.save()
,如下所示:

如果让relatedItems=response[“related”]as?[[String:Any]]{
//创建相关项目
对于相关项目中的d{
let related=尝试createAssociatedFromResponse(响应:d)
产品。添加到关联产品(相关)
}
请尝试self.managedObjectContext.save()
}
编辑:
如何在
createAssociatedFromResponse
中创建对象

编辑2:
您不应使用
NSManagedObjectContext