删除核心数据中的重复对象(swift)

Qub*_*ex_ 6 ios swift

我正在使用JSON将对象保存到核心数据中,我使用for循环(假设我调用了此setup函数.因为用户可能会停止此循环,保存在核心数据中的对象将是部分的.用户可以重新启动此setup功能,重新启动解析和将对象保存到核心数据的过程.

现在,如果我重新启动,我将在核心数据中获得重复的对象setup().该对象具有一个属性id.

我认为我可以获取最初可能已经存在于核心数据中的第一个对象,将它们保存到一个数组(一个自定义类型),并测试每个新对象以添加到核心数据(如果已存在的那个具有相同的数据)id.使用的代码如下:

if !existingCards.isEmpty {
    for existingCard in existingCards {
        if id == existingCard.id {
           moc.deleteObject(existingCard)
           println("DELETED \(existingCard.name)")
        }
    }
}

...
// "existingCards is the array of object fetched previously.
// Code to save the object to core data.
Run Code Online (Sandbox Code Playgroud)

实际上,应用程序返回

EXC_BAD_ACCESS(代码= 1,地址0x0)

有没有更简单的方法来实现我的目的或我应该修复什么来使我的代码工作?我很新,我无法想出其他解决方案.主要目的是删除重复的核心数据,BTW.

Qub*_*ex_ 6

最后,我设法让它发挥作用.

我不得不重写我的代码,因为我之前已经意识到moc.deleteObject()使用fetch工作,这在我以前的代码中并不是在同一个函数中,而是在它中viewDidLoad().

// DO: - Fetch existing cards
var error: NSError?
var fetchRequest = NSFetchRequest(entityName: "Card")
if let results = moc.executeFetchRequest(fetchRequest, error: &error) as? [Card] {

   if !results.isEmpty {
     for x in results {
        if x.id == id {
          println("already exist")
          moc.deleteObject(x)
        }
     }
   }
} else {
   println(error)
}
Run Code Online (Sandbox Code Playgroud)

不再existingCards,现在可以尽快处理获取的结果.我还不清楚什么,但现在我的代码工作了.如果您有任何改进/更好的方法,欢迎他们.

PS:我实际上发现Apple参考有用但很难理解,因为我不知道Obj-C.通常我可以看出代码的作用,但是在快速的函数和属性中有点不同.


Lio*_*ion 5

删除重复对象的 Swift 4 代码:

let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Card")
        var resultsArr:[Card] = []
        do {
            resultsArr = try (mainManagedObjectContext!.fetch(fetchRequest) as! [Card])
        } catch {
            let fetchError = error as NSError
            print(fetchError)
        }

 if resultsArr.count > 0 {
  for x in resultsArr {
    if x.id == id {
          print("already exist")
          mainManagedObjectContext.deleteObject(x)
        }
      }
   }
Run Code Online (Sandbox Code Playgroud)