gpt4 book ai didi

ios - +[NSManagedObjectModel mergedModelFromBundles::forStoreMetadata:] 总是返回 nil

转载 作者:行者123 更新时间:2023-11-29 11:29:01 25 4
gpt4 key购买 nike

我有一个包含 15 个版本的核心数据模型。它有代码可以在发布时逐步从当前商店的版本迁移到最新版本。

关键是调用

    NSDictionary* options = @{ NSMigratePersistentStoresAutomaticallyOption : @true,
NSInferMappingModelAutomaticallyOption : @true };
NSDictionary* sourceMetadata = [NSPersistentStoreCoordinator
metadataForPersistentStoreOfType: inType
URL: inSourceStore
options: options
error: outError];
NSManagedObjectModel* model = [NSManagedObjectModel mergedModelFromBundles: @[ [NSBundle bundleForClass: [self class]] ]
forStoreMetadata: inSourceMetadata];

但这总是返回 nil,我不确定为什么。现有商店是版本 14,新模型是版本 15。

现在,对模型的最后更改是相当微不足道的(添加了几个可选字段),所以我认为它可以自动推断映射,但那是行不通的,所以我添加了一个映射模型版本 14 到版本 15 使用 Xcode 的助手,没有做任何改变。

知道为什么它返回 nil,或者我可以做些什么来进一步调查这个问题?

同样,当我说“版本 14”时,我指的是 .xcdatamodel 文件的顺序编号。有什么方法可以查看实际商店并确定 Core Data 认为它是哪个版本的模型?

最佳答案

好吧,首先,您似乎知道自己在做什么,经历了 14 次 Core Data 迁移等等。所以我认为您应该留意一些愚蠢的拍额头类型的错误。

确保 [NSBundle bundleForClass: [self class]] 返回预期的包,其中包含目录 Contents/Resources/YourModelName.momd,并且该目录包含所有必需的 .mom 文件(每个版本一个)和一个 VersionInfo.plist 文件。我的构建还包含一个仅适用于最新版本的 .omo 文件。

现在我来回答你的第二个问题,这确实可以帮助你回答你的第一个问题。

在那个 VersionInfo.plist 文件中,您会找到一个名为 NSManagedObjectModel_VersionHashes 的字典,它又包含子字典,每个版本一个键。每个版本子字典都包含每个实体名称和值的键,它是该版本中该实体的属性和关系的 32 字节(256 位)散列。我们将其称为模型哈希

现在使用 SQLite 查看器或 sqlite3 命令行工具打开一个存储数据库文件。在该数据库中,模型中的每个实体都有一个表,旁边是一个名为 Z_METADATA 的表,其中包含一行三列。名为 Z_PLIST 的列的值被键入为二进制数据 block 。将该数据复制到一个文件中,将其命名为扩展名 .plist,双击它会在您最喜欢的 plist 编辑器中打开,因为该数据实际上是代表 XML 格式的 Apple 属性列表的文本字符串.它的键NSStoreModelVersionHashes的值实际上是一个子字典,就像VersionInfo.plist文件中的子字典一样。我们称其为存储哈希。 32 字节(256 位)版本散列采用 Base64 编码。 (有44个Base64字符,由于每个Base64字符代表6位,所以44个字符最多可以代表44*6 = 264位。)

最后,回答你的第二个问题,传递给 +[NSManagedObjectModel mergedModelFromBundles:forStoreMetadata:]storeMetadata 实际上是来自 Z_METADATA商店,其中包含那些商店哈希+[NSManagedObjectModel mergedModelFromBundles:forStoreMetadata:] 将这些 store hashes 与传入 中每个候选数据模型的 model hashes 进行比较bundle,并返回其模型散列与所有实体的存储散列匹配的模型,两边都没有额外的不匹配实体。

所以您会发现手动进行比较有点乏味。但可能在探索这些 plists 时,你会发现那个前额拍打器。如果没有,请为我们提供有关您粘贴的代码的更多背景信息,也许有人可以提供帮助。

关于ios - +[NSManagedObjectModel mergedModelFromBundles::forStoreMetadata:] 总是返回 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55545388/

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