gpt4 book ai didi

ios - 从可能损坏的核心数据数据库中恢复

转载 作者:行者123 更新时间:2023-11-29 00:05:06 28 4
gpt4 key购买 nike

我有一个 iOS 应用程序,它将其数据存储在核心数据数据库中。基本结构有 Libraries 和 Items,它们之间的多对多关系由 LibraryItemMapping 表示。映射项目包含一个索引,以便项目可以在不同的容器中进行不同的排序。这在大多数情况下工作正常,但在我自己用于开发/测试的设备上,我遇到了核心数据对象为这些关系的一侧或另一侧返回 nil 的情况。如果我在启动时枚举这些对象(通过 AppDelegate 中的代码),nils 消失并且我能够检索关系两侧的对象,但是几秒钟后寻找相同的关系时,它们开始返回 nil。例如,这总是运行正常并且永远不会出错或发现任何 nils:

public func runConsistencyCheck() {
do {
let mappings = try dataContext.fetch(NSFetchRequest<LibraryItemMapping>(entityName: "LibraryItemMapping"))
for map in mappings {
if (map.item==nil || map.library==nil) {
print("Found corrupt mapping record. Deleting.")
dataContext.delete(map)
}
}
saveContext()
} catch {
print("An error occurred during consistency checking: \(error)")
}
}

但这经常会为 obj.item 找到 nil 和/或在我的设备上崩溃:

func getMapping(forItem item: Item) -> LibraryItemMapping? {
if (libraryData?.itemMappings != nil) {
for obj in libraryData!.itemMappings as! Set<LibraryItemMapping> {
if (obj.item != nil && obj.item! == item) { return obj }
else {
print("Found Core Data mapping with null item data.")
}
}
}
return nil
}

尝试创建或修改然后保存任何其他记录会导致此错误的多次迭代:

"Error Domain=NSCocoaErrorDomain Code=1570 \"item is a required value.\" UserInfo={NSValidationErrorKey=item, NSLocalizedDescription=item is a required value., NSValidationErrorObject=<LibraryItemMapping: 0x174098060> (entity: LibraryItemMapping; id: 0xd0000000001c0000 <x-coredata://ED9F1AE5-A7D0-46FD-AC94-941E9EFEF341/LibraryItemMapping/p7> ; data: {\n    index = 4;\n    item = nil;\n    library = \"0xd000000000140004 <x-coredata://ED9F1AE5-A7D0-46FD-AC94-941E9EFEF341/LibraryData/p5>\";\n})}"

这只发生在我知道的一台设备上,所以我很想把它放到某个时候被错误的调试 session 损坏的数据库中,但至少我希望能够优雅地清理它。如果这是 SQL,我将只运行一致性检查和类似 delete from LibraryItemMapping where item is null or library is null 然后继续,但我不确定如何使用 Core 执行等效操作数据。如何进一步解决此问题,以及如何从看似损坏的数据库中优雅地恢复?

最佳答案

从设备中提取 sqlite 文件并挖掘原始数据后,这实际上是一个数据模型错误。在应用程序启动期间,它会经历一个“修剪旧记录”步骤,并且链接表关系上不一致的删除规则允许它使记录处于不一致状态。更正删除规则以根据需要使用 CascadeNullify 后,一切又恢复正常了。

关于ios - 从可能损坏的核心数据数据库中恢复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48271728/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com