Coredata关系问题

时间:2015-09-27 19:38:20

标签: ios swift core-data

我的核心数据面临着一个奇怪的问题。我有以下关系enter image description here

联系人可以属于一个类别,而一个类别可以有多个联系人。我想在创建联系人时访问联系人中的类别。 我的关系是否正确?

我收到以下错误"无法指定类型'字符串的值!'值类型'类别'"在这个领域里:     newContact.category = categoryField.text

这就是我尝试访问我的类别字段的方式:

// MARK: - Properties
    var contact: Contact?   

func createCategory() {
        let entity = NSEntityDescription.entityForName("Category", inManagedObjectContext: context!)
        let category = Category(entity: entity!, insertIntoManagedObjectContext: context)
        let index = pickerView.selectedRowInComponent(0)
        let color = categoryColor[index]

            category.name = name.text
            category.descript = descriptionField.text
            category.color = color
            println(category.name)
            context?.save(nil)
        name.text = ""
        descriptionField.text = ""
    }

     func createNewContact() {
    let entity = NSEntityDescription.entityForName("Contact", inManagedObjectContext: context!)
            let newContact = Contact(entity: entity!, insertIntoManagedObjectContext: context)
                newContact.name = nameField.text
                newContact.email = emailField.text
                newContact.phone = phoneField.text
                newContact.category = categoryField.text
                newContact.photo = UIImageJPEGRepresentation(imageHolder.image, 1)

            var error: NSError?

            context?.save(&error)
    }

And that's how my entities look like: 

    @objc (Contact)
    class Contact: NSManagedObject {

        @NSManaged var email: String
        @NSManaged var name: String
        @NSManaged var phone: String
        @NSManaged var photo: NSData
        @NSManaged var category: Category

    }

@objc (Category)
class Category: NSManagedObject {

    @NSManaged var color: AnyObject
    @NSManaged var descript: String!
    @NSManaged var name: String!
    @NSManaged var contact: NSOrderedSet

}

2 个答案:

答案 0 :(得分:2)

category对象的Contact属性是Category对象。但是您尝试将其设置为String(categoryField.text)。您可能希望使用Category等于name的{​​{1}}对象。

您可以创建一个:

categoryField.text

但您可能已经使用 let categoryEntity = NSEntityDescription.entityForName("Category", inManagedObjectContext: context!) let newCategory = Category(entity: categoryEntity!, insertIntoManagedObjectContext: context) newCategory.name = categoryField.text // set the other properties for the Category as necessary // then assign the relationship newContact.category = newCategory 创建了Category。因此,通常的方法是搜索具有正确name的类别,如果存在则使用该类别,或者如果不存在则创建新类别:

name

答案 1 :(得分:1)

答案出在你的错误中:

  

无法指定“String!”类型的值到“类别”类型的值

错误在于,category类中的Contact属性被定义为保存Category类型对象,而不是NSString的实例。

所以你需要分配一个Category类型的对象,如下所示:

创建新类别,或以任何方式获取现有类别,在这里我们将创建新类别并将其分配给联系人。

let catEntity = NSEntityDescription.entityForName("Category", inManagedObjectContext: context!)
let category = Category(entity: catEntity!, insertIntoManagedObjectContext: context)
category.name = categoryField.text // get the name from field and set to category property
category.color = someColor //assign your required color

现在将其分配给Contact中的category属性,如下所示:

newContact.category = category