繁体   English   中英

如何将NSDictionary类型的对象添加到包含NSDictionaryResultType对象的NSMutableArray中?

[英]How to add object of NSDictionary type to an NSMutableArray which contains objects of NSDictionaryResultType?

我正在使用以下代码从Core Data中获取数据-

NSManagedObjectContext *context=[[self appDelegate] managedObjectContext];

NSEntityDescription *entityDesc=[NSEntityDescription entityForName:@"Messages" inManagedObjectContext:context];
NSFetchRequest *request=[[NSFetchRequest alloc] init];
[request setEntity:entityDesc];
[request setResultType:NSDictionaryResultType];
NSArray *objects=[context executeFetchRequest:request error:&error];

包含以上代码的函数向我返回了NSDictionaryType的NSArray。 在视图控制器上,我将它们存储到viewdidload函数中的NSMutableArray *消息中。 现在,如果收到或发送了新消息,我想将新的NSDictionary存储到消息中。 这样做会产生错误:

由于未捕获的异常“ NSInvalidArgumentException”而终止应用程序,原因:“-[__ NSArrayI addObject:]:无法识别的选择器已发送到实例0x9740230”

代码获取数据

CoreDataHandler *handler=[[CoreDataHandler alloc] init];

NSMutableArray *messages=[[NSMutableArray alloc]initWithObjects: nil];
messages=(NSMutableArray *)[handler fetchMessages:[chatWithUser objectForKey:@"jidStr"]];

我在邮件中添加对象的代码

NSMutableDictionary *m = [[NSMutableDictionary alloc] init];
[m setObject:messageStr forKey:@"msg"];
[m setObject:@"you" forKey:@"sender"];
[m setObject:[NSString getCurrentTime] forKey:@"createdAt"];
[messages addObject:(NSDictionary *) m];

仅仅因为您宣布狗是猫,并不意味着它会突然“变苗”。 它仍然是只狗,只穿着猫的衣服。 现在请注意。 问题是您正在尝试将东西放入不可变的NSArray中。 一旦创建了一个不可变的数组,就无法更改其内容。

你可以试试这个

NSMutableArray *objects=[[context executeFetchRequest:request error:&error] mutable copy];

您应该在NSArray上使用NSMutableArray,NSArray不包含方法addObject。 您可以创建可变副本,例如:

NSMutableArray *objects=[[context executeFetchRequest:request error:&error] mutableCopy;

现在,您可以随意在该对象上调用addObject方法。

您能否提供您在此处引用的其他代码? (例如,您说您将从上述获取中获得的消息存储在NSMutableArray中。在声明为可变数组的地方显示代码,在实例化该代码,并在获取结果中添加代码。) 从错误消息来看,您正在尝试将对象添加到NSArray,而不是添加到NSMutableArray。

您能否提供您在此处引用的其他代码? (例如,您说您将从上述获取中获得的消息存储在NSMutableArray中。在声明为可变数组的地方显示代码,在实例化该代码,并在获取结果中添加代码。) 从错误消息来看,您正在尝试将对象添加到NSArray,而不是添加到NSMutableArray。

好的,因此您正在创建一个NSMutableArray并将其指针存储在“消息”中。 但是,然后您为“消息”分配了一个不同的指针。 您将不可更改的结果集分配给它。 你不应该那样做。 取而代之的是,仅将获取中的对象添加到消息对象中。 像[messages addObjectsFromArray:fetchresults]之类的东西;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM