【发布时间】:2020-12-07 03:47:26
【问题描述】:
我正在对应用进行大规模更新。通过大更新读取完整的返工 - 全新的代码库从头开始但具有相同的 bundleID 能够在发布时放弃旧应用程序。
我目前正在研究 CoreData 迁移,但遇到了一些问题:
- 旧应用只有一个数据库:
OldData - 新应用将有多个数据库,但只有一个我们感兴趣:
NewData
我想从OldData加载信息,手动迁移到NewData,然后删除OldData中的数据。
我们已将OldData 的一个版本复制到新应用中,但是当我们搜索保存的对象时,没有返回任何内容。
我们返回数据库:
let coreDataManager = CoreDataManager(modelName: "OldData")
let context = coreDataManager.persistentContainer.viewContext
if try context.count(for: NSFetchRequest(entityName: "OldObjectName")) > 0 {
上下文存在但不返回任何内容。
我已经调查了 mappingModels,但这似乎要求我们能够访问旧数据才能对其进行映射,目前新应用中没有可用的旧数据。
似乎没有太多关于在代码库之间迁移 CoreData 的信息,而是专注于更新您正在使用的数据库的版本。
我尝试了什么:
- 我已验证 CoreData 没有被添加到顶部的新应用程序删除。当我重新加载旧应用时,数据仍然存在
- 在测试时,我可以在两个项目之间访问相同的 UserDefaults,这再次让我放心,数据存在但未被访问
- 在线调查迁移教程 - 所有这些似乎都集中在版本之间或同一代码库内部的迁移
感觉这应该比我做的容易
- 这甚至可能吗? - 我们是否必须使用
same数据库 - 因为我们只能在原始代码库中执行此操作,因为即使旧数据库的副本也不同 - 我只是在配置方面做错了吗 - 数据库是否链接到项目名称或两个项目之间不同的其他内容。
让这件事变得更棘手的一个问题是我们没有任何空间来修改旧代码 - 我们只需要编写新代码来迁移旧代码。
编辑 1:
在我的调查中,我注意到两个项目数据库的代码生成是不同的——旧项目中的 Objective-C 和新项目中的 swift。当我最初导入OldData 时,它仍然是Objective-C 代码生成。一旦我将它切换到 swift 旧数据库开始出现,但保存的对象仍然没有出现在我的提取中。
我不确定这是否是由语言代码生成差异引起的问题
编辑 2: 在进行一些测试后,使用不同的代码生成器语言似乎不会导致任何问题。
但我确实注意到 SQL 数据库存储在不同的位置:
旧的存储在Documents 文件夹中,新的存储在Application Support 文件夹中。相关文章here
这意味着问题可能是我们将两个 SQL 文件放在不同的位置,这意味着数据库不是使用旧的,而是创建一个新的空文件。
我将继续关注如何在配置时将新应用中的旧数据库指向不同的位置。
【问题讨论】:
标签: ios swift core-data core-data-migration