从 JSON 初始化链接 CoreData 实体

Posted

技术标签:

【中文标题】从 JSON 初始化链接 CoreData 实体【英文标题】:Link CoreData entities from JSON initialization 【发布时间】:2014-12-30 02:16:49 【问题描述】:

我有一个关于 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】:

在核心数据中使用唯一 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

【讨论】:

以上是关于从 JSON 初始化链接 CoreData 实体的主要内容,如果未能解决你的问题,请参考以下文章

从 CoreData 获取多个实体

从核心数据创建 json 字符串,反之亦然?

为核心数据实体添加便利初始化程序

从集合视图移动到详细视图时如何利用 CoreData

在运行时查找 CoreData 模型的实体

CoreData 困境:没有反向关系的实体