2010-08-29 72 views
0

我开始觉得很愚蠢 - 我浏览过网站,发现一些接近我的问题的东西,但无法弄清楚(帮助M. Zarra,之后阅读你的书,我对Core Data感觉非常好,但现在我已经完全了解了!)。尽管有专家的建议,我选择将NSMutableArray作为可转换属性存储在我的核心数据实体中。该数组本身填充了自定义对象,并且具有所需的encodeWithCoder:和initWithCoder:方法。我在那里添加了NSLogs,以查看他们何时开枪。核心数据没有返回NSMutableArray属性

现在,第一次运行,填充一切,等它的优良和我做保存退出一切(我可以在东西得到了在编码的XML文件中看到。)

然而,在重新启动时,检索NSManagedObject,然后尝试访问可变形属性,我什么也得不到 - 尽管日志语句指示initWithCoder:成功运行。就好像解码是作为获取NSManagedObject的一部分完成的,但是属性本身没有被填充(我试过了所有的东西,包括setReturnsObjectsAsFaults:No)。打印对象描述显示'priceData - “(...不是零...)”所以我真的不知道它为什么不允许访问/返回什么。

我想要做的是得到mutableArray,检查它是否包含一个元素,如果它确实,用其他东西替换它。我今天早上开始并认为这很简单,但7个小时后我仍然无处可去。

有什么想法吗?我真的很感谢在这个问题上的任何帮助/提示/建议。

[第二个问题 - 为什么它 - 显然是愚蠢的把数据放在核心数据的数组中?我正在处理很多很多个案的长时间序列,并且将每个数据点挤压到一个实体中的选项看起来好像会创建一个巨大的时间序列数据点表,我假定抓取性能会很快降级。我错]

的代码如下给出:

NSManagedObjectContext *managedObjectContext = [[NSApp delegate] managedObjectContext]; 
//1. Retrieve the NSManagedObject with the price history from the MOC 
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease]; 
[request setIncludesSubentities:YES]; 
[request setIncludesPendingChanges:YES]; 
[request setIncludesPropertyValues:YES]; 
[request setReturnsObjectsAsFaults:NO]; 
NSEntityDescription *entity = 
[NSEntityDescription entityForName:@"stockPriceHistory" inManagedObjectContext:managedObjectContext]; 
[request setEntity:entity]; 
NSPredicate *predicate = 
[NSPredicate predicateWithFormat:@"stock == %@", [[self selectedObjects]objectAtIndex:0]]; 
[request setPredicate:predicate]; 
NSError *error; 
NSArray *array = [ managedObjectContext executeFetchRequest:request error:&error]; 

NSManagedObject *test = [array objectAtIndex:0]; 

NSLog([test description]); 
NSLog(@"%@",[[test priceData] description]); 

..其给出以下日志输出(第一线是表示在阵列中的对象中的时间戳日志再次得到了解码) :

2010-08-29 18:48:54.245项目X [23047:A0F] 2010-08-27 13:00:00 0200

2010-08-29 18:48:54.246项目X [23047:a0f] 2010-08-26 13:00:00 +0200

2010-08-29 18:48:54.250项目X [23047:a0f] 2010-08-25 13:00:00 +0200

2010-08-29 18:48:54.251项目X [23047: A0F] 2010-08-24 13:00:00 0200

2010-08-29 18:48:54.252项目X [23047:A0F] 2010-08-23 13:00:00 0200

2010-08-29 18:48:54.253项目X [23047:A0F] 2010-08-20 13:00:00 0200

2010-08-29 18:48:54.253项目X [23047:A0F ] 2010-08-19 13:00:00 +0200

2010-08 -29 18:48:54.255 Project X [23047:a0f] 2010-08-18 13:00:00 +0200

2010-08-29 18:48:54。255项目X [23047:a0f] 2010-08-17 13:00:00 +0200

2010-08-29 18:48:54.256项目X [23047:a0f] 2010-08-16 13:00: 00 0200

2010-08-29 18:48:54.256项目X [23047:A0F] 2010-08-13 13时○○分00秒0200

2010-08-29 18:48:54.257 Project X [23047:a0f] 2010-08-12 13:00:00 +0200

2010-08-29 18:48:54.258 Project X [23047:a0f](entity:stockPriceHistory; id:0x10043d950; data :{ dataPointCount = 0; priceData =“(... not nil ..)”; stock =“0x100445040”; })

2010-08-29 18:48:54.260项目X [23047:A0F( ) (GDB)

回答

0

你覆盖NSManagedObject这个类?如果是这样,你是否覆盖了数组的访问器?其awakeFromFetch方法被调用? initWithCoder调用在哪里进行?可能应该在awakeFromFetch中。你可以有一个持久属性'codedArray'和另一个非持久属性'array'。在awakeFromFetch中,读取'codedArray'属性,对其进行解码,并设置其余代码将读取的'array'属性。

codedArray = [self valueForKey:@"codedArray"]; 
// decode array... 
[self setPrimitiveValue:decodedArray forKey:@"array"]; 

你为什么只在Core Data中放入一个数组?嗯,是的,看起来很奇怪。如果您使用的是编码器,则只需写入平面文件即可。由于您将每个对象排成自己的行,您将失去SQL DB的好处;您必须先将整个数组读取到内存中,然后再进行搜索。

+0

感谢您的回复。我想我有点跟随。这些对象是:priceHistory:NSManagedObject,它包含可变形属性(它本身由其他对象组成,如上所述进行编码)。我没有对NSMutableArray本身进行任何en /译码,因为我让Core Data这样做。所以我不确定你的方法会有什么好处?实际上,有一个属性会有两个属性,但我认为可以这么做 - 就像我的代码一样,它可以正确工作并保存所有内容,但由于某些原因无法将它们从Core Data中取出。 – NSSunrider 2010-08-29 18:22:58

+0

啊,对不起,我的核心数据代码是10.4兼容的,并没有为你做所有的编码。希望现在你不需要配对属性。 您是否重写priceHistory的KVC属性访问器? – 2010-08-29 21:42:59

+0

我尝试覆盖(将标准xcode 4模板代码从id更改为NSMutableArray),并尝试不覆盖任何内容 - 相同的结果。 – NSSunrider 2010-08-30 06:12:24