为 IOS 访问/创建核心数据 slqlite 数据库失败 - 找不到实体(创建了空数据库)

Posted

技术标签:

【中文标题】为 IOS 访问/创建核心数据 slqlite 数据库失败 - 找不到实体(创建了空数据库)【英文标题】:Accessing / creating core data slqlite database for IOS fails - entity not found (empty database created) 【发布时间】:2012-07-11 00:03:50 【问题描述】:

您好,我是 ios 的初学者,并创建了我的第一个核心数据应用程序。我已经创建了我的模态并将其包含在项目中。它确实包含实体“客户”。当我使用以下测试代码创建数据库并尝试添加实体时,出现以下错误

..'+entityForName: 找不到实体名称“ItemMake”的 NSManagedObjectModel

当调用 [NSEntityDescription insertNewObjectForEntityForName:@"Client" inManagedObjectContext:contxt];

我已经检查了所有我能想到的,代码如下所示。这是一些进一步的信息...

a) mdl 和 contxt 不为零。

b) 在模拟器中创建数据库文件(16kb)

c) 从另一个工具访问数据库只显示两个似乎是 SQLlite 系统表的表

d) 包确实包含一个“EasyOrder.momd”目录和一个“EasyOrder.mom”文件。该应用名为“EasyOrder”。

e) 该项目包含一个“EasyOrder.xcdatamodeld”文件,其中定义了一个客户实体(以及其他实体)。

f) 我在我的数据库中尝试了其他实体,结果相同

g) My 是一个标准应用程序,我也添加了核心数据支持。我没有在应用程序委托中使用默认代码,但我的示例也没有。

代码如下

NSManagedObjectContext *contxt;
NSManagedObjectModel *mdl;
NSPersistentStoreCoordinator *ps;

mdl = [NSManagedObjectModel mergedModelFromBundles:nil];
ps = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mdl];


NSArray *documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);                

NSString *docDir = [documentDirectories objectAtIndex:0];

NSString *dbLoc = [docDir stringByAppendingPathComponent:@"test.sqllite"];

NSURL *databaseUrl = [NSURL fileURLWithPath:dbLoc];

NSError *err;

if ([ps addPersistentStoreWithType:NSSQLiteStoreType
                     configuration:nil 
                               URL:databaseUrl 
                           options:nil 
                             error:&err] == false) 
    NSLog(@"%@", err);


[contxt setUndoManager:nil];



//Add record

//在这里崩溃!

Client *c = [NSEntityDescription insertNewObjectForEntityForName:@"Client" inManagedObjectContext:contxt];


[c setEntityRef:1234];

....

tia 抢

【问题讨论】:

您的模型或代码中有什么会使应用程序想要创建一个名为“ItemMake”的实体? 对不起,错误来自我其他测试的 oenn。我在示例代码中 //CRASHES HERE 之后的行中从 @"ItemMake" 更改为 @"Client"。 【参考方案1】:

我刚刚解决了这个问题。我相信存在某种版本控制问题,其中使用的数据模型很旧并且不包含表。

我用一个虚拟模型(只有一个表)创建了一个测试应用程序,它运行良好。然后我删除了该模型并使用了我实际应用程序中的模型。它继续正常工作,但没有根据数据模型创建表。所以我从模拟器中删除了运行时间,然后它正确地创建了所有表。

我在我的实际应用程序中遵循相同的过程,从模拟器中删除,删除模型,添加具有不同名称的模型并重新构建。应用现在可以运行了!

【讨论】:

以上是关于为 IOS 访问/创建核心数据 slqlite 数据库失败 - 找不到实体(创建了空数据库)的主要内容,如果未能解决你的问题,请参考以下文章

iOS 8 - 为 App Group 创建 SQLite 数据库

iOS:核心数据,与Auto ID的关系数

如何从 Today Extensions(iOS 8) 访问核心数据详细信息?

iOS Today Extension - 共享核心数据

使用 NSArray 从 iOS 上的可转换核心数据创建对象

更新的核心数据模型属性不可访问?