【问题标题】:Establishing relationship between two entities?建立两个实体之间的关系?
【发布时间】:2017-02-27 04:57:06
【问题描述】:

我在表格视图中有事件的名称,我喜欢将用户的响应(是 = 1,否 = 2 来自动作控制器)连同事件名称一起保存。所以我创建了 2 个实体

EventSchedule (eventName: String, eventTime: Transformable) 

one to one关系eventSchedule

EventDec (eventStatus: Integer16)

one to one反比关系eventDec

我做了以下

 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath){
            let alert = UIAlertController(title: "title", message: "msg", preferredStyle: .alert)
            alert.addAction(UIAlertAction(title: "yes", style: .default) { _ in

let eventDesc = NSEntityDescription.insertNewObject(forEntityName: "EventDec", into: context)
let eventSch = NSEntityDescription.insertNewObject(forEntityName: "EventSchedule", into: context)

//How do I add relationship property to the above objects so that I can store event name along with response in database?

            eventDesc.setValue(1, forKey: "eventStatus")
            do
            {
                try context.save()
                print("Record Saved Successfully")
                print(eventDesc)
            }
            catch{}
        })
        alert.addAction(UIAlertAction(title: "no", style: .default) { _ in

 let eventDesc = NSEntityDescription.insertNewObject(forEntityName: "EventDec", into: context)
    let eventSch = NSEntityDescription.insertNewObject(forEntityName: "EventSchedule", into: context)

//How do I add relationship property to the above objects so that I can store event name along with response in database?

            eventDesc.setValue(2, forKey: "eventStatus")
            do
            {
                try context.save()
                print("Record Saved Successfully")
                print(eventDesc)
            }
            catch{} 
        })

        present(alert, animated: true, completion: nil)
}

【问题讨论】:

  • 您可以像插入数据eventDesc.setValue(2, forKey: "eventStatus")一样设置与KVC的关系。您必须在那里使用关系名称。

标签: swift xcode core-data


【解决方案1】:

您可以将didSelectRowAt 替换为以下内容(基于聊天中的讨论):

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath){

    let eventDesc = NSEntityDescription.insertNewObject(forEntityName: "EventDec", into: context) as! EventDec
    var eventSch: EventSchedule?
    do {
        let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "EventSchedule")
        fetchRequest.fetchLimit = 1
        fetchRequest.predicate = NSPredicate(format: "eventName == %@", self.eventTitle)
        var objects: [EventSchedule]

        try objects = context.fetch(fetchRequest) as! [EventSchedule]
        eventSch = objects[0] as EventSchedule
        print(eventSch)

    } catch {
        print("whatever")
    }

    eventSch.eventDec = eventDesc
    eventDesc.eventSchedule = eventSch

    let alert = UIAlertController(title: "title", message: "msg", preferredStyle: .alert)

    alert.addAction(UIAlertAction(title: "yes", style: .default) { _ in
        eventDesc.setValue(1, forKey: "eventStatus")

        do {
            try context.save()
        } catch{
            print("Try again")
        }
    })

    alert.addAction(UIAlertAction(title: "no", style: .default) { _ in
        eventDesc.setValue(2, forKey: "eventStatus")

        do {
            try context.save()
        } catch {
            print("Try again")
        }
    })
    present(alert, animated: true, completion: nil)
}

【讨论】:

    【解决方案2】:
    // ... Your code...
    
    let eventDesc = NSEntityDescription.insertNewObject(forEntityName: "EventDec", into: context)
    
    // insert eventDesc into coredata
    eventDesc.setValue(2, forKey: "eventStatus")
    
    // relation & inverse relation
    eventSch.eventDec = eventDesc
    eventDesc.eventSchedule = eventSch
    
    // rest of your code, as is...
    

    告诉我,进展如何。


    编辑

    您可以获得eventSch 对象,如下所示:

    do {
        let fetchRequest = NSFetchRequest(entityName: "EventSchedule")
        fetchRequest.fetchLimit = 1
        fetchRequest.predicate = NSPredicate(format: "name == %@", your_event_name)
        var objects: [EventSchedule]
    
        // objects[0] is your object here.
        try objects = context.executeFetchRequest(fetchRequest) as! [EventSchedule]
    
    } catch {
        print("whatever")
    }
    

    【讨论】:

    • 感谢您的回复,我在另一个 viewController 中填充了 eventSch 值。那么我是否需要创建类型为“Integer”的“relation_key”和“inverse_relation_key”属性,因为它在执行代码后显示“'NSManagedObject' 类型的值没有成员'relation_key'?
    • 如果您在另一个视图控制器中创建它,那么您需要获取特定的eventSch 对象才能使上述代码正常工作。您正在创建一个新的 eventSch 对象。这就是它不起作用的原因。
    • 好的。我会拿来试试。关系呢。我需要创建任何特殊属性来建立关系吗?
    • 没有。你不需要任何东西。您可以从您定义的.momd 文件中获取关系和反向关系名称/键。
    • 感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2020-01-01
    • 2015-03-27
    • 1970-01-01
    相关资源
    最近更新 更多