【问题标题】:Coredata relationship issue核心数据关系问题
【发布时间】:2015-09-27 19:38:20
【问题描述】:

我的核心数据遇到了一个奇怪的问题。我有以下关系

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

我收到以下错误“无法分配 '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

}

【问题讨论】:

    标签: ios swift core-data


    【解决方案1】:

    Contact 对象的category 属性是Category 对象。但是您正试图将其设置为字符串 (categoryField.text)。您可能想要使用name 等于categoryField.textCategory 对象。

    你可以创建一个:

        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
    

    但您可能已经使用该name 创建了一个Category。所以通常的方法是搜索具有正确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
        }
    

    【讨论】:

    • 你介意私聊吗,我是 swift 和 ios 的新手,需要问一些问题
    • @congolesedevelopper 很高兴去聊天。
    • @congolesedevelopper 我创建了一个chat room
    【解决方案2】:

    答案就在你的错误中:

    无法分配“字符串!”类型的值到“类别”类型的值

    错误是说,Contact 类中的category 属性被定义为保存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
    

    【讨论】:

    • 这就是为什么我写了您可以通过任何方式创建新类别或获取现有类别,即通过NSFetchRequest 进入您的数据库,或者已经获取的类别。我只写了创建新类别的详细信息,目的是给你一个指针,你需要在哪里做正确的事情。
    猜你喜欢
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多