核心数据问题:更新数据模型时无法识别的选择器

时间:2014-01-04 14:35:19

标签: ios objective-c core-data nsmanagedobject

我有一个使用Core Data管理数据库的项目。这个数据库工作正常,但我需要在表中添加一个新字段。当我创建数据模型的新版本时,添加该字段并返回以创建NSManagedObject子类(自动生成)。应用程序在我添加的新字段中以“无法识别的选择器”错误结束。

新的自动生成表是下一个:

File.h

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

@class Session;

@interface File : NSManagedObject

@property (nonatomic, retain) NSDate * date;
@property (nonatomic, retain) NSString * fileType;
@property (nonatomic, retain) NSString * pathFile;
@property (nonatomic, retain) NSString * name;     // NEW FIELD
@property (nonatomic, retain) Session *session;

@end

File.m

#import "File.h"
#import "Session.h"

@implementation File

@dynamic date;
@dynamic fileType;
@dynamic pathFile;
@dynamic name;      // NEW FIELD
@dynamic session;

@end

这些是数据库中的所有关系:

Database

这是在代码中创建实体:

File *newFile = [File createEntity];
newFile.pathFile = pathFile;
newFile.fileType = @"Video";
newFile.name = @"Video 1";
newFile.date = [[NSDate alloc] init];
if ([sessionPicker selected] < sessions.count) {
     newFile.session = [sessions objectAtIndex:[sessionPicker selected]];
}

[[NSManagedObjectContext defaultContext]saveToPersistentStoreWithCompletion:nil];

我之前提到的错误是下一个错误(只在新字段中失败,如果我注释该行添加文件名,创建工作正常):

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[File setName:]: unrecognized selector sent to instance 0xc667770'

我尝试删除对datamodel的引用并再次添加它们,但这也失败了。此外,我试图清理项目并删除模拟器的应用程序,但这也失败了。

有任何解决方案或建议吗?

编辑:

NSLog输出

(lldb) po [[newFile entity] properties]
<__NSArrayM 0xc6f7340>(
(<NSAttributeDescription: 0xc2ac350>), name date, isOptional 1, isTransient 0, entity File, renamingIdentifier date, validation predicates (
), warnings (
), versionHashModifier (null)
 userInfo {
}, attributeType 900 , attributeValueClassName NSDate, defaultValue (null),
(<NSAttributeDescription: 0xc2ac3a0>), name fileType, isOptional 0, isTransient 0, entity File, renamingIdentifier fileType, validation predicates (
), warnings (
), versionHashModifier (null)
 userInfo {
}, attributeType 700 , attributeValueClassName NSString, defaultValue (null),
(<NSAttributeDescription: 0xc2ac3f0>), name pathFile, isOptional 0, isTransient 0, entity File, renamingIdentifier pathFile, validation predicates (
), warnings (
), versionHashModifier (null)
 userInfo {
}, attributeType 700 , attributeValueClassName NSString, defaultValue (null),
(<NSAttributeDescription: 0xc2ac440>), name syncID, isOptional 1, isTransient 0, entity File, renamingIdentifier syncID, validation predicates (
), warnings (
), versionHashModifier (null)
 userInfo {
}, attributeType 700 , attributeValueClassName NSString, defaultValue (null),
(<NSRelationshipDescription: 0xc2acc50>), name session, isOptional 1, isTransient 0, entity File, renamingIdentifier session, validation predicates (
), warnings (
), versionHashModifier (null)
 userInfo {
}, destination entity Session, inverseRelationship files, minCount 0, maxCount 1, isOrdered 0, deleteRule 1
)

2 个答案:

答案 0 :(得分:1)

最后,我实现了解决问题:在“构建阶段”(在项目的属性中),我删除了数据库捆绑的副本并返回添加。

问题是这个包是在Derived Data文件夹中生成的,虽然我将创建新的副本,但是这个文件仍然被弃用。当我删除派生数据的所有文件和文件夹时,xCode会向我显示有关此文件夹的几个错误并与捆绑包相关。因此,我再次构建数据模型,在项目中复制新包,然后在项目的“构建阶段”中再次添加(删除旧包之后)。

答案 1 :(得分:-1)

您无法在不迁移Core Data的情况下升级Core Data中的数据库架构。这为应用程序提供了“映射”。请仔细阅读此Apple Doc以获取更多信息,以及有关如何迁移的说明。