从JSON初始化链接CoreData实体

时间:2014-12-30 02:16:49

标签: ios iphone core-data

我有一个关于CoreData的简单问题。我正在Swift中开发一个应用程序,在那里我查询返回JSON数据的远程API。响应在我这边从字符串序列化为字典。

我在Core Data模型中有多个实体,它们之间有关系。

从API获取响应时,我使用自定义初始化程序创建一个对象(NSManagedObject的子类)。

这是一个简化的例子:

class Song: NSManagedObject {

    @NSManaged var type : Type?
    @NSManaged var name : String?

    override init(entity: NSEntityDescription, insertIntoManagedObjectContext context: NSManagedObjectContext?) {
        super.init(entity: entity, insertIntoManagedObjectContext: context)
    }

    init(fromDictionary dictionary: NSDictionary, context: NSManagedObjectContext, filterRemoved: Bool) {

        let entity = NSEntityDescription.entityForName("Song", inManagedObjectContext: context)!
        super.init(entity: entity, insertIntoManagedObjectContext: context)

        if let nameValue = dictionary["name"] as? String{
            name = nameValue
        }
        if let typeData = dictionary["type"] as? NSDictionary{
            type = Type(fromDictionary: typeData, context:context)
        }
    }

我的问题是关于Type元素。服务器端有一些固定数量的类型(" Dance"," Jazz",...),因此我想要修复多种类型在我的核心数据中。但是,在我当前的实现中,每次创建Song对象时都会创建一个新的Type实体。所以我喜欢的是某种"外键"两者之间的关联(即使CoreData本身不是数据库......)

知道Type有一个id属性在服务器上唯一标识它的最佳方法是什么?或者在使用Core Data时我真的不应该关心这些事情吗?

1 个答案:

答案 0 :(得分:0)

在核心数据中使用唯一ID非常有用。然后,您可以快速查询以查看具有该id的类型是否存在,并返回该类型(如果存在)(只要您创建一个Type实体)。如果它不存在,则创建它。

func fetchType(typeID: Int) -> Type? {

    // Define fetch request/predicate
    var fetchRequest = NSFetchRequest(entityName: "Type")
    let predicate = NSPredicate(format: "id == %@", typeID)

    // Assign fetch request properties
    fetchRequest.predicate = predicate
    fetchRequest.fetchBatchSize = 1
    fetchRequest.fetchLimit = 1

    // Handle results
    let fetchedResults = managedObjectContext?.executeFetchRequest(fetchRequest, error: nil)
    if fetchedResults?.count != 0 {
        if let fetchedEvent: Event = fetchedResults![0] as? Event {
            return fetchedEvent
        }
    }
    return nil
}