ios - Swift 核心数据关系和播种数据

标签 ios json swift core-data

我目前正在解析 JSON 数据,并根据结果是否存在更新或创建实体。

我正在使用 SwiftyJson 进行 JSON 解析。

我的 NSManagedObject 子类中有一个 createInManagedObjectContext 函数,它接受一组用于创建新记录的参数:

 class func createInManagedObjectContext(moc: NSManagedObjectContext, id: String, flatNumber: String, propertyName: String, propertyNumber: String, street: String, locality: String, town: String, postcode:String, createdDate: NSString) -> Work {
        let newWorkItem = NSEntityDescription.insertNewObjectForEntityForName("Work", inManagedObjectContext: moc) as! Work

        var mydate = createdDate
        let formatter = NSDateFormatter()

        formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS"

        newWorkItem.createdDate = formatter.dateFromString(mydate as String)!



        newWorkItem.id = id
        newWorkItem.flatNumber = flatNumber
        newWorkItem.propertyName = propertyName
        newWorkItem.propertyNumber = propertyNumber
        newWorkItem.street = street
        newWorkItem.locality = locality
        newWorkItem.town = town
        newWorkItem.postcode = postcode

        return newWorkItem
    }

这是我目前用来解析 json 并创建新记录的代码:

 if let moc = self.managedObjectContext {
    moc.performBlockAndWait({
        Work.createInManagedObjectContext(moc,
            id: object["Id"].stringValue,
            flatNumber: object["FlatNumber"].stringValue,
            propertyName: object["PropertyName"].stringValue,
            propertyNumber: object["PropertyNumber"].stringValue,
            street: object["Street"].stringValue,
            locality: object["Locality"].stringValue,
            town: object["Town"].stringValue,
            postcode: object["Postcode"].stringValue,
            createdDate: object["CreatedDate"].stringValue

        )

        for party in object["Parties"].arrayValue {

            Party.createInManagedObjectContext(moc,
                id: party["Id"].stringValue,
                firstName: party["FirstName"].stringValue,
                lastName: party["LastName"].stringValue,
                propertyName: party["PropertyName"].stringValue,
                propertyNumber: party["PropertyNumber"].stringValue,
                street: party["Street"].stringValue,
                locality: party["Locality"].stringValue,
                town: party["Town"].stringValue,
                postcode: party["Postcode"].stringValue,
                createdDate: party["CreatedDate"].stringValue)

        }
        // println(object["Parties"])



    })
    moc.save(nil)
}

现在我知道这不是执行此类操作的最佳方式,老实说,这个模式会非常大,其他实体中会有很多记录依赖这个 Work 实体。

我想我会从聚会开始,因为可以有很多聚会,但我不确定如何将每个聚会与工作实体联系起来。我确实尝试过传入 workId,并认为也许我需要将 Work 对象传回 Work 托管对象,但我敢肯定,有比使用诸如此类的庞大函数更好的方法吗?

所以我的问题是,在这种情况下处理创建具有多重关系的实体的最佳方法是什么?

更新:

我改变了我的实现如下:

let work = NSEntityDescription.insertNewObjectForEntityForName("Work", inManagedObjectContext: moc) 作为!工作

let formatter = NSDateFormatter()

formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS"

work.id = object["Id"].stringValue
work.flatNumber = object["FlatNumber"].stringValue
work.propertyName = object["PropertyName"].stringValue
work.propertyNumber = object["PropertyNumber"].stringValue
work.street =  object["Street"].stringValue
work.locality = object["Locality"].stringValue
work.town = object["Town"].stringValue
work.postcode = object["Postcode"].stringValue
work.createdDate = formatter.dateFromString(object["CreatedDate"].stringValue)!


for obj in object["Parties"].arrayValue {
    let party = NSEntityDescription.insertNewObjectForEntityForName("Party", inManagedObjectContext: moc) as! Party



    party.id = obj["Id"].stringValue
    party.firstName = obj["FirstName"].stringValue
    party.lastName =  obj["LastName"].stringValue
    party.propertyName = obj["PropertyName"].stringValue
    party.propertyNumber = obj["PropertyNumber"].stringValue
    party.street = obj["Street"].stringValue
    party.locality = obj["Locality"].stringValue
    party.town = obj["Town"].stringValue
    party.postcode = obj["Postcode"].stringValue
    party.createdDate = formatter.dateFromString(obj["CreatedDate"].stringValue)!

    //doesn't work
    work.parties.addlistObject(party)

}

我确实尝试过实现下面描述的 NSSet 解决方案,但遇到了问题,即迭代我的 JSON 的当前 for 循环正在运行

编辑:

我已经设法通过添加让它工作

  party.work = work as Work

按照下面的建议在 for 循环中。

现在它可以正常运行一段时间并且似乎在做正确的事情,直到它因错误而崩溃:

fatal error: unexpectedly found nil while unwrapping an Optional value

这是一个单独的还是相关的问题?

最佳答案

您尝试使用 Core Data 做的事情实际上非常简单。您所要求的是一种将两个实体彼此连接在一起的方法。

现在,您似乎希望一个工作实体下有多个参与方。这意味着您正在查看 Work 实体和 Parties 实体之间的一对多关系。您需要做的就是在两个实体之间创建如下所示的关系:

To-Many Relationship

首先,转到“关系”选项卡下的工作实体,然后单击“+”按钮。将此新关系命名为“parties”,然后单击 enter。将目的地设为您的缔约方实体。

其次,转到您的 Parties 实体并执行相同操作,将关系命名为“work”并将其目的地设置为您的 Work 实体。但是这一次,单击“反向”下的下拉菜单并选择您的政党关系,以在您的工作实体和政党实体之间形成一对一关系。现在,您的 Work 实体的每个实例都包含一个变量,该变量包含对方实体的一个实例,反之亦然。

Entity Relationships

但是,您可能希望“Parties”实体的多个实例将您连接到一个 Work 实例,因此现在您希望将关系更改为一对多关系。我们可以通过转到您的工作实体并单击“各方”关系来完成此操作。现在,在右侧的数据模型检查器中,查找显示“类型”的菜单。单击菜单并从下拉列表中选择“To Many”。

To-Many Relation

您现在拥有实体之间的一对多关系!

现在,要在代码中添加连接,请打开您的 Parties.swift 文件并在底部键入:

@NSManaged var work: Work

这提供了对参与方所连接的工作对象的引用。您可以在 for party in object["Parties"].arrayValue ... 中创建您的 Parties 实例时设置此项。只需使用

party.work = {Your Work instance}

然而,对于 Work 类,情况略有不同。你看,按照我们建立关系的方式,Parties 实体只能在一个工作实体下,但 Work 实体可以包含多个 Parties。 Core Data 会将这些存储为 NSSet(或者 NSOrderedSet,如果你想对集合中的 Parties 对象进行排序)。所以将这段代码添加到 Work.swift 的底部:

@NSManaged var parties: NSSet

这将创建一个 NSSet 实例,它将包含 Work 实例下的所有 Parties。现在您可以通过创建一个新的 NSSet 实例并将其分配给 parties 变量来添加一个派对,如下所示:

let newSet = NSMutableSet(setWithSet: parties)
newSet.addObject({party variable})
myWork.parties = newSet.copy() as! NSSet

然后,如果您有 workID,则可以使用 myParty.work.workID == "SomeWorkID" 检查 ID。如果需要,您还可以通过各方 NSSet 进行枚举。

希望这个答案能帮助您完成您想要完成的任务!如果这不能完全回答您的问题,请告诉我。

如果您想对 CoreData 关系做更多的研究,您可以获得一本关于 Core Data 的书(我购买了 Ray Wenderlich 的“Core Data by Tutorials”)或查看 Apple 的文档 here .

关于ios - Swift 核心数据关系和播种数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31573816/

相关文章:

swift - UITextField 在 SKScene 上不可见

iphone - 仅在 iOS 6.0 中,UIImagePickerController 关闭时将 View 向上推至 20 px

ios - 如何在 NSManagedObjectContext 上正确调用 fetch()?

iphone - 如何使用任何第三方库在iOS应用程序中编辑现有pdf文档。

c# - Xamarin.iOS 和 Swift 的互操作性

swift - 插入或拔出耳机时 AVAudioEngine 崩溃

iphone - 解析xml内容标签

java - jackson 将单个项目反序列化为列表

c# - 带有显示 html 的对话框部分 View 的 mvc PartialView

python - 如何按键排序json文件