2

我是 IOS 开发的新手,并且在使用 coredata 时跌跌撞撞。

我创建了一个AppPage实体,其中的pageId属性标记为唯一约束。

现在我可以使用以下代码在AppPage中插入一行:

let context =  getAppDelegate().persistentContainer.viewContext


    let appPage = AppTable(context: context)

    appPage.pageId = 12
    appPage.pContent = "Hello ManiKanta"


    do{
        try getAppDelegate().persistentContainer.viewContext.save()

        print("saved successfully")
    }catch{
        print("error while saving")
    }

现在,当我在这里想要的是,如果再次以pageId为 12 且 pContent新更新信息的行,实体中的同一行应该使用更新的信息进行更新。

我用谷歌搜索并发现

getAppDelegate().persistentContainer.viewContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy

但是设置NSMergeByPropertyObjectTrumpMergePolicy在我的 XCode(v8.3.2) 中给了我一个编译错误

如果行不存在,则基本上插入一行,否则使用给定的 id 更新行。

这是 Xcode 抛出的编译错误。

Use of unresolved identifier NSMergeByPropertyObjectTrumpMergePolicy

4

2 回答 2

2

由于您使用的是 Swift,因此名称不同。而不是NSMergeByPropertyObjectTrumpMergePolicy,您应该使用NSMergePolicyType.mergeByPropertyObjectTrumpMergePolicyType. 使用 Swift 时,名称不同是一样的。

于 2017-05-24T14:45:12.380 回答
0

AppTable你需要用 that获取一个pageId。如果您找到了,请使用您必须更新的数据。如果您没有找到,请创建一个新的,就像您在问题中显示的那样。如果你发现很多,你有一个错误需要处理。

在你的情况下:

let context =  getAppDelegate().persistentContainer.viewContext
let request: NSFetchRequest<AppTable> = NSFetchRequest(entityName: "AppTable")
let fetchId = 12
request.predicate = NSPredicate(format: "pageId == %d", fetchId)
    do {
        let fetched = try context?.fetch(request)
        // you should find 1
        if fetched?.count == 1 {
            print("same pageId: /(fetchId)")
            // you can update it here if you want
        } else if fetched?.count == 0 {
            // There is no AppTable with this id so create a new one
            let appPage = AppTable(context: context)
            // Populate all the properties here and save
            // ...
于 2017-05-23T10:52:36.177 回答