我有一个使用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
这些是数据库中的所有关系:
这是在代码中创建实体:
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
)
答案 0 :(得分:1)
最后,我实现了解决问题:在“构建阶段”(在项目的属性中),我删除了数据库捆绑的副本并返回添加。
问题是这个包是在Derived Data文件夹中生成的,虽然我将创建新的副本,但是这个文件仍然被弃用。当我删除派生数据的所有文件和文件夹时,xCode会向我显示有关此文件夹的几个错误并与捆绑包相关。因此,我再次构建数据模型,在项目中复制新包,然后在项目的“构建阶段”中再次添加(删除旧包之后)。
答案 1 :(得分:-1)
您无法在不迁移Core Data的情况下升级Core Data中的数据库架构。这为应用程序提供了“映射”。请仔细阅读此Apple Doc以获取更多信息,以及有关如何迁移的说明。