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

问题描述 投票:6回答:2

我将对象保存到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.

实际上,应用程序返回

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

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

ios swift
2个回答
4
投票

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)
        }
      }
   }

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)
}

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

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

© www.soinside.com 2019 - 2024. All rights reserved.