核心数据生成空SQLite数据库

时间:2011-07-17 21:54:00

标签: iphone sqlite core-data

我有一个数据库,我一直在使用我的项目进行多次构建。我最初使用核心数据构建了数据库,提取了生成的SQLite文件,填充了我的数据,然后将生成的SQLite文件添加到我的项目中。这已经适用于使用轻量级迁移来更改我的数据库结构的几次迭代。然而,在我的最后一次尝试中,核心数据突然开始抱怨散列不匹配。

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

崩溃

我可能出错的任何想法?

1 个答案:

答案 0 :(得分:2)

不支持直接填充SQLite存储文件。 Apple不会记录sqlite存储架构并在没有警告或通知的情况下对其进行更改。如果您直接访问Core Data之外的sqlite存储文件,您可能会发现存储在操作系统和SDK更新的过程中会在某些时候失败。

错误A fetch request must have an entity是由为获取请求分配nil值引起的,通常这是由此行引起的:

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

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

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

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

[aFetchRequest setEntity:alphaEntity];

...你得到了错误。

您可以直接从上下文访问模型:

[[aMangedObjectContext persistentStoreCoordinator] managedObjectModel]

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

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