我又在努力解决一个核心数据任务,它一直在我身上随机失败
下面的代码正在构建我的初始数据库,这是应用程序正常工作所必需的
(...)
let context = await (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
(...)
for person in groupOfPeople { //singlePerson (codable Struct) <> SinglePerson (NSManagedObject)
saveSinglePerson(sPerson: person, context: context)
counter+=1
}
logComment = logComment + "..success!((counter))"
func saveSinglePerson(sPerson: singlePerson, context: NSManagedObjectContext) {
let newSinglePerson = SinglePerson(context: context)
newSinglePerson.id = sPerson.ID
newSinglePerson.name = sPerson.name
newSinglePerson.age = sPerson.age
(...)
context.performAndWait {
do {
try context.save()
}catch let error {
print(error)
Logging.insertError(message: "IMPORT ERROR: (error.localizedDescription)", location: "buildDatabase20")
}
}
}
现在我的问题是:一开始我甚至没有注意到有问题,因为一切都很好,所有的对象都被保存为它们应该是,但确实有一个,因为:我随机得到一个错误,像这样:
error= Error Domain=NSCocoaErrorDomain Code=134030 "An error occurred while saving." UserInfo={NSAffectedObjectsErrorKey=(
"<AppName.SinglePerson: 0x60000104e7b0> (entity: SinglePerson; id: 0x600003337ce0 <x-coredata:///SinglePerson/t3081F988-C5D1-4532-AD81-46F3B4B10215139>; data: {n id = 138;n name = testname;n age = "25";n })"
和我得到这个错误多次(20x-150x),只有这一个单一的ID,在这个例子138,但它是一个不同的ID每次…我调查这个情况已经好几天了,我就是无法理解这个…我现在发现的是这个方法应该插入150行,如果出现这个错误,它就不是149,而是87 127之类的似乎对象在上下文中卡住了,并且在第一个错误之后的每次执行都失败并抛出(相同的)错误…
我试图获取那些新的写入数据后直接插入它们,我总是得到相同的(错误的)计数150..我知道这个计数是不合法的,因为如果我看一下sqlite文件,会看到只有87或127或其他行数。
我做这个取回再次与相同的上下文,这就是为什么我认为这个问题是在我的NSManaged上下文..
为什么这发生在我身上?为什么这种情况有时会发生,而不是一直发生?怎么解呢?
我已经找到了一个解决方案来解决这个问题,即使我现在知道我将从头开始重新工作所有核心数据交互,使其真正稳定可靠。这是我的第一个swift项目,所以一路上事情变得相当混乱TBH:)
修复:事实上,我保存所有创建的对象现在一次,而不是保存每个项目自己,做的工作,并解决了这个问题,为我在这一刻:)
也许这对其他人也有帮助;)
(...)
let context = await (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
(...)
var personArray = [SinglePerson]()
for person in groupOfPeople {
let newSinglePerson = SinglePerson(context: context)
newSinglePerson.id = sPerson.ID
newSinglePerson.name = sPerson.name
newSinglePerson.age = sPerson.age
(...)
personArray.append(newSinglePerson)
}
context.performAndWait {
do {
try context.save()
} catch let error {
print(error.localizedDescription)
}
}