【问题标题】:Weird Core Data Reaction - Not Detecting NSManagedObject Sub Classes奇怪的核心数据反应 - 未检测到 NSManagedObject 子类
【发布时间】: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


【解决方案1】:

这是我在一个项目中偶然发现的一个错误。

Message 不能用作实体名称...为什么? ... 苹果 ... ???

不知道。

重命名为其他名称,这通常可以解决问题。

【讨论】:

  • 是的,根据 cmets 关于我的问题的第一个建议,我也这样做了。但这很糟糕。浪费了我 5 个小时的时间。
  • 只是把它作为一个答案,所以如果有人在某个时候看这个会更清楚
  • 它不能用作实体名称,因为 Apple 的一些天才在没有使用命名空间前缀(例如“UI”、“NS”、“AB”等)的情况下命名了一个类“Message”。 请务必通过bugreport.apple.com 向 Apple 提交错误报告。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-14
  • 1970-01-01
相关资源
最近更新 更多