Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.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 2.1核心数据-保存关系创建空记录_Ios_Swift_Core Data - Fatal编程技术网

Ios Swift 2.1核心数据-保存关系创建空记录

Ios Swift 2.1核心数据-保存关系创建空记录,ios,swift,core-data,Ios,Swift,Core Data,我的项目有类别和配方实体,它们有一对多的关系 当用户创建新配方时,选择类别是可选的。 如果未选中,将使用默认类别与配方建立关系 当激发createRecipe()时,它将向配方实体添加正确的类别关系。但问题是,类别实体中会添加一条空记录 我确保changedCategory和defaultCategory都不是“”,所以我不确定为什么在类别实体中添加了这个”。 我正在用sqlitebrowser检查数据输入 如何防止使用以下代码将en空记录添加到类别实体 func createRecipe(se

我的项目有类别和配方实体,它们有一对多的关系

当用户创建新配方时,选择类别是可选的。 如果未选中,将使用默认类别与配方建立关系

当激发
createRecipe()
时,它将向配方实体添加正确的类别关系。但问题是,类别实体中会添加一条空记录

我确保
changedCategory
defaultCategory
都不是
”,所以我不确定为什么在类别实体中添加了这个
。 我正在用sqlitebrowser检查数据输入

如何防止使用以下代码将en空记录添加到类别实体

func createRecipe(sender: AnyObject!) {

    if let title = recipeTitle.text where title != "" {
        let category = obtainCategoryEntity(changedCategory, defaultCategory: defaultCategory, context: self.context)
        let recipe = (NSEntityDescription.insertNewObjectForEntityForName("Recipe", inManagedObjectContext: self.context) as! Recipe)

        recipe.category = category

        recipe.title = title
        ...

        do {
            try self.context.save()
        } catch {
            print("Could not save recipe")
        }    
    }
}

func obtainCategoryEntity(changedCategory: String, defaultCategory: String, context: NSManagedObjectContext) -> RecipeCategory {

    var category = NSEntityDescription.insertNewObjectForEntityForName("RecipeCategory", inManagedObjectContext: self.context) as! RecipeCategory

    let fetchRequest = NSFetchRequest(entityName: "RecipeCategory")

    if changedCategory != "" {
        fetchRequest.predicate = NSPredicate(format: "name == %@", changedCategory)
    } else {
        fetchRequest.predicate = NSPredicate(format: "name == %@", defaultCategory)
    }

    if let results = (try? context.executeFetchRequest(fetchRequest)) as? [RecipeCategory] {
        if results.count > 0 {
            category = results[0]
        }
    }

    return category
}

在获取类别实体中,如果提取请求找不到具有该名称的现有类别,则需要将category.name设置为changedCategory或defaultCategory。

谢谢。我在Create()中有category.name=categoryEntity。它不会是重复的吗?而且不会出现获取请求找不到现有类别的情况。我在这里没有显示的类别viewcontroller中进行检查。我注意到您已经回答了我前面的问题。从那个问题开始,情况发生了一点变化,我将您的代码应用到Category viewcontroller,其中需要添加新的类别和重复检查。在本问题中提到的CreateRecipe viewcontroller中,我仅获取类别实体和分配关系,但它意外地创建了一个空类别记录。如前所述,获取类别实体总是插入一个新的类别实体。这就是NSEntityDescription.insertNewObjectForEntityForName所做的。并且它将始终为空,因为您在插入category.name后未设置它。如果您打算检索一个现有类别,并且您确信它将始终存在,那么您应该编写一个不同的函数,该函数不调用insertNewObjectForEntityForName。在我发布的原始代码中,插入类别的调用是在获取之后进行的。您在提取之前移动了它,这就是为什么总是创建一个。