核心数据:无法将持久存储添加到协调器

Posted

技术标签:

【中文标题】核心数据:无法将持久存储添加到协调器【英文标题】:Core Data: Not able to add persistent store to coordinator 【发布时间】:2012-04-30 20:47:57 【问题描述】:

我正在制作一个基于某些属性(例如名称、颜色、重量等)显示生物体的应用,但这些属性要到运行时才能知道。这就是我以编程方式创建 NSManagedObjectModel 的原因。似乎我能够正确初始化模型,因为我使用 NSLog 语句来显示有机体实体的属性。但是当我调用该方法时:

[orgPersistentStoreCoordinator 
addPersistentStoreWithType:NSSQLiteStoreType                                        
configuration:nil URL:storUrl options:nil error:&error]

它返回 NO,我在持久存储协调器方法中收到错误消息:

“无法添加持久存储:操作无法完成。(Cocoa 错误 256。)”

我已经尝试打开这些选项,但我仍然遇到同样的错误:

NSString * const NSMigratePersistentStoresAutomaticallyOption;
NSString * const NSInferMappingModelAutomaticallyOption;

这里是完整的代码:

- (NSPersistentStoreCoordinator *)orgPersistentStoreCoordinator 

if (orgPersistentStoreCoordinator != nil) 
    return orgPersistentStoreCoordinator;

NSURL *storUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory]
                                          stringByAppendingPathComponent:@"organisms.sqlite"]];
NSError *error = nil;

orgPersistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc]
                              initWithManagedObjectModel:[self orgManagedObjectModel]];

NSLog(@"Entities: %@",[[self orgManagedObjectModel] entities]);

if (![orgPersistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType 
                                                 configuration:nil URL:storUrl options:nil error:&error]) 
        /*Error for store creation should be handled in here*/
    NSLog(@"Could not add persistent store:%@",[error localizedDescription]);


return orgPersistentStoreCoordinator;


这是我如何以编程方式创建 ManagedObjectModel 的简要说明。

+ (NSManagedObjectModel *) orgManagedObjectModel 

FieldGuide *f = [FieldGuide sharedFieldGuide];



NSManagedObjectModel *orgModel = [[NSManagedObjectModel alloc]init];

NSEntityDescription *organismEntity = [[NSEntityDescription alloc]init];
[organismEntity setName:@"OrganismCoreData"];
[organismEntity setManagedObjectClassName:@"OrganismCoreData"];
[orgModel setEntities:[NSArray arrayWithObject:organismEntity]];


NSMutableArray *orgEntityProperties = [[NSMutableArray alloc]init];

 // 1. Name attributes
for (NameParameter *n in f.nameAttributes) 

    NSAttributeDescription *nameAttr = [[NSAttributeDescription alloc]init];
    [nameAttr setName:n.name];
    [nameAttr setAttributeType:NSStringAttributeType];
    [orgEntityProperties addObject:nameAttr];

[organismEntity setProperties:orgEntityProperties];


return orgModel;

最后,当我尝试插入一些生物体并通过 NSManagedObjectContext 保存时,应用程序终止并在日志中显示:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'This NSPersistentStoreCoordinator has no persistent stores.  It cannot perform a save operation.'

任何帮助或指导将不胜感激,谢谢!

编辑: 是的,我已经尝试从模拟器中删除应用程序,清理目标,并通过查找器从文档文件夹中删除生物体.sqlite。

编辑#2: 我忘了补充一点,addPersistentStore 方法还返回另一个错误:

2012-04-30 14:13:46.109 biodex[7510:14803] CoreData: error: (1) I/O error for database at /Users/junryandelacruz/Library/Application Support/iPhone Simulator/5.1/Applications/ACE957AF-2FC0-4EAF-B226-5019F70FAB90/Documents/organisms.sqlite.  SQLite error code:1, 'near "OR": syntax error'

【问题讨论】:

【参考方案1】:

您的storeURL 似乎有误。这是“未知文件读取错误”,通常与文件的路径有关。

来自documentation:

NSFileReadUnknownError = 256,

第二个错误当然与添加持久存储无关。检查您的代码中的“OR”谓词。

【讨论】:

嗯。我认为这就是原因,但我很肯定该网址是正确的。难道是我事先没有文档目录中的organism.sqlite文件吗?我的印象是,如果它不存在,core data 会为你创建它。 实际上,always 方法试图创建一个新的持久存储。如果一个已经存在,你会得到一个错误。 我从模拟器中删除了我的应用程序。然后重建并在模拟器上运行它,问题就消失了。可能是损坏的 sql 文件。

以上是关于核心数据:无法将持久存储添加到协调器的主要内容,如果未能解决你的问题,请参考以下文章

重置存储时核心数据崩溃:“无法从此 NSManagedObjectContext 的协调器访问对象的持久存储”

核心数据持久存储协调器不存在

持久存储协调器核心数据错误:NSSQLiteErrorDomain = 522

无需迁移即可替换核心数据模型

使用两个持久存储协调器进行高效后台更新的陷阱

CoreData 多个持久存储协调器?