【发布时间】:2014-02-27 06:57:08
【问题描述】:
在我使用Core Data的应用中似乎有一个非常奇怪的错误。
我已经处理了所有需要的事情,并且它在过去几周内一直在工作。
我昨天关闭了项目,今天开始开发(没有修改代码)现在每次我想向我的数据库添加一行时,我都会收到一个异常,说下面的类不是NSManagedObject 的子类,我很可笑地确定这不是真的,首先是因为它已经工作了好几天,其次是因为我将它们自动生成为 NSManagedObject 子类。我尝试在我的数据模型中使用 Editor->Create NSManagedObject Subclasses 重新生成类,但这对我没有任何帮助。
这真的很奇怪,我突然得到了这个异常,而且我的代码中没有任何修改:(
有人知道吗?我真的很感激任何帮助。 谢谢
顺便说一句,这里有一些代码可能会有所帮助:
错误:
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '"Message" is not a subclass of NSManagedObject.
消息类头文件(自动生成):
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
@class File;
@interface Message : NSManagedObject
@property (nonatomic, retain) NSString * data;
@property (nonatomic, retain) NSDate * date;
@property (nonatomic, retain) NSString * fileId;
@property (nonatomic, retain) NSString * number;
@property (nonatomic, retain) NSString * status;
@property (nonatomic, retain) NSString * type;
@property (nonatomic, retain) NSString * xmppId;
@property (nonatomic, retain) File *contains;
@end
我尝试创建新消息对象的方法:
+ (void)sendXMPPMessage:(NSString *)messageStr containingFile:(NSData *)fileData toNumber:(NSString *)number
{
if(fileData == nil)
{
NSString *newID = [self generateNewXMPPMessageID];
SunBirdAppDelegate *appDelegate = (SunBirdAppDelegate *)[[UIApplication sharedApplication] delegate];
[appDelegate sendXMPPMessage:messageStr withID:newID toNumber:number];
NSMutableDictionary *messageDataDic = [[NSMutableDictionary alloc] init];
[messageDataDic setObject:messageStr forKey:@"body"];
[messageDataDic setObject:@"Outgoing" forKey:@"type"];
[messageDataDic setObject:newID forKey:@"xmppId"];
[messageDataDic setObject:@"Sending" forKey:@"status"];
[messageDataDic setObject:[NSDate date] forKey:@"date"];
[messageDataDic setObject:number forKey:@"number"];
[Message messageWithMessageInfo:messageDataDic inManagedObjectContext:[appDelegate managedObjectContext]];
}
else
{
//Handle Database With File Data
}
}
创建新消息对象 -> 消息类上的创建类别 (Message+Create.m) :
+ (Message *)messageWithMessageInfo:(NSDictionary *)messageInfo inManagedObjectContext:(NSManagedObjectContext *)context
{
SunBirdAppDelegate *appDelegate = (SunBirdAppDelegate *)[[UIApplication sharedApplication] delegate];
Message *newMessage = nil;
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Message"];
request.predicate = [NSPredicate predicateWithFormat:@"xmppId = %@", [messageInfo objectForKey:@"msgId"]];
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"xmppId" ascending:YES];
request.sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
NSError *error = nil;
NSArray *matches = [context executeFetchRequest:request error:&error];
if (!matches || ([matches count] > 1))
{
// handle error
}
else if ([matches count] == 0)
{
newMessage = [NSEntityDescription insertNewObjectForEntityForName:@"Message" inManagedObjectContext:context];
newMessage.data = [messageInfo objectForKey:@"body"];
newMessage.type = [messageInfo objectForKey:@"type"];
newMessage.date = [messageInfo objectForKey:@"date"];
newMessage.xmppId = [messageInfo objectForKey:@"xmppId"];
newMessage.status = [messageInfo objectForKey:@"status"];
newMessage.number = [messageInfo objectForKey:@"number"];
if ( [[messageInfo allKeys] containsObject:@"fileId"] )
{
newMessage.fileId = [messageInfo objectForKey:@"fileId"];
newMessage.contains = [messageInfo objectForKey:@"fileData"];
}
else
{
newMessage.fileId = NULL;
newMessage.contains = NULL;
}
}
else
{
newMessage = [matches lastObject];
NSLog(@"WARNING : NO NEW MESSAGE STORED IN DB ! MESSAGE WITH SAME XMPPID RETURNED");
}
[appDelegate saveContext];
return newMessage;
}
这是我被告知Message 不是NSManagedObject 的子类:
newMessage = [NSEntityDescription insertNewObjectForEntityForName:@"Message" inManagedObjectContext:context];
【问题讨论】:
-
尝试将类名从
Message更改为其他名称... -
为什么?
Message名称运行良好 -
你试过清理和清理构建文件夹吗?重置内容并在设备上重新安装?您是否更改过 Core Data 模型版本?
-
是的,清洁、重新安装和重置没有帮助。我重命名了
Message。显然这是一个有时会导致运行时问题的关键字!
标签: ios iphone objective-c core-data nsmanagedobject