2015-09-27 166 views
0

我正在面对一个奇怪的问题与我的核心数据。我有以下关系enter image description hereCoredata关系问题

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

我收到以下错误“无法指定类型'String!'的值在这一领域一类 '类别'”的价值: 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

一个Contact对象的category属性是Category对象。但是你试图将它设置为一个字符串(categoryField.text)。您可能想要使用Category对象,其name等于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 

但你可能已经创建了一个Categoryname。所以,通常的做法是寻找与正确name一个类别,使用,如果它存在,或创建如果没有一个新的类别:

let categoryEntity = NSEntityDescription.entityForName("Category", inManagedObjectContext: context!) 
    let fetchRequest = NSFetchRequest() 
    fetchRequest.entity = categoryEntity! 
    fetchRequest.predicate = NSPredicate(format:"name == %@",categoryField.text) 
    let fetchResults = try? context!.executeFetchRequest(fetchRequest) 
    if let results = fetchResults { 
     var requiredCategory : Category 
     if (results.count > 0) { 
      requiredCategory = results[0] as! Category 
     } else { 
      requiredCategory = Category(entity: categoryEntity!, insertIntoManagedObjectContext: context!) 
      requiredCategory.name = categoryField.text 
      // set the other properties for the Category as necessary 
     } 
     newContact.category = requiredCategory 
    } 
+0

你介意去私人聊天,我很快就会进入一个私人聊天室,需要问几个问题 –

+0

@congolesedevelopper高兴地去聊天。 – pbasdf

+0

好的谢谢。我可用 –

1

答案出在你的错误:

Cannot assign a value of type 'String!' to a value of type 'Category'

错误是说,你r categoryContact中的属性定义为保留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 

现在赋值给在联系您的类别属性,如:

newContact.category = category 
+0

感谢您的答案,但我已经有了类创建 –

+0

这就是为什么我写道,你可以通过任何方式创建新的类别或获取现有的类别,例如通过“NSFetchRequest”进入你的数据库,或已经获取的类别。我只写了创建新类别的细节,这个想法是给你一个指针,你需要提供正确的东西。 –