iphone - 核心数据生成空 SQLite 数据库

标签 iphone sqlite core-data

我有一个数据库,我已经在我的项目中使用了多次构建。我最初使用核心数据构建数据库,提取生成的 SQLite 文件,填充我的数据,然后将生成的 SQLite 文件添加到我的项目中。这已经在使用轻量级迁移来更改我的数据库结构的多次迭代中发挥了作用。然而,在我的最后一次尝试中,核心数据突然开始提示哈希不匹配。

在无法解决问题后,我决定简单地从项目中删除 SQLite 文件、清理构建并删除应用程序数据(目的是让核心数据为我初始化一个新的 SQLite 文件)。现在,核心数据甚至不会初始化数据库,并且生成的 SQLite 文件为空(没有表)。当我尝试运行代码时,它崩溃并显示 executeFetchRequest:error: A fetch request must have anEntity.

有什么想法我可能会出错吗?

最佳答案

不支持直接填充 SQLite 存储文件。 Apple 不会记录 sqlite 存储架构,并且会在没有警告或通知的情况下更改它。如果您确实在 Core Data 之外直接访问 sqlite 存储文件,则可以预期该存储会在操作系统和 SDK 更新过程中的某个时刻失败。

错误获取请求必须有实体是由于为获取请求分配nil值引起的,通常这是由这一行引起的:

NSEntityDescription *alphaEntity=[NSEntityDescription entityForName:@"Alpha" inManagedObjectContext:aManagedObjectContext];

...返回nil,因为给定上下文加载的任何托管对象模型中不存在具有给定名称的实体。

最常见的原因是简单的拼写错误,例如当实际实体名称是@“Aleph”时给出@“Alpha”,但这也可能是由于加载正确的或任何托管对象模型失败引起的。

当您在获取请求中使用 nil 实体时:

[aFetchRequest setEntity:alphaEntity];

...您收到错误。

您可以通过以下方式直接从上下文访问模型:

[[aMangedObjectContext permanentStoreCoordinator] ManagedObjectModel]

依次NSManagedObjectModel提供了多种可用于查询事件模型的方法,例如entitiesByName 将返回一个字典,其键是模型已知的所有实体名称的名称。

直接访问模型可以告诉你发生了什么。要么您有拼写错误,要么由于某种原因您没有加载模型。

关于iphone - 核心数据生成空 SQLite 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6727031/

相关文章:

iphone - 为什么 NSFetchedResultsController 在设置获取批量大小时加载所有行?

iphone - 如何动态填充 NSArray?

sqlite - 如何在 Azure 上使用 EF 更新/迁移 SQLite 数据库

ios - 归档在 ios 中需要很多内存和更多时间吗

iOS - 核心数据集属性主键

java - Android- 如何更新另一个 Activity 的数据。在你正在工作的那个之外

ios - 因未知原因而崩溃指针被释放

iphone - 增强现实 SDK

html - 网站在 iPhone 和 iPad 上显示 20px 的内边距

c++ - 使用 Qt 和 SQLite 数据库的并发