ndf*_*red 6 iphone entity-relationship core-data ios
我有一个Core Data模型代表iOS 4+上的电视指南,有3个类:
Channel (BBC 1)Program (最高档)Broadcast (周一晚上8点BBC 1的Top Gear)我有大约40个频道,8000个节目和6000个广播,我想微调导入过程,这样它不需要花一分钟才能运行.
导入频道和节目很容易,因为它们是独立的对象.然而,广播与频道和节目(1对多)有关系,并且频道和节目都与广播(多对1)具有反向关系.为了加快速度,我有一个故障通道的内存字典和只预取了Web服务标识符的程序:我创建一个广播并查看两个字典,以获得相应的通道和程序,而无需往返数据库.
但是当我将节目或频道分配给广播时,频道和节目的反向关系访问会立即触发两个对象的故障,导致大量减速(6000*2请求)和随之而来的内存压力,如核心数据故障所示仪器报告.我尝试broadcasts在两个频道和节目上预先获取关系,但这种关系仍然存在问题.
你知道为什么反向关系被访问并且他们的父母有错吗?保存关系时如何避免从数据库中读取?
更新:示例代码,我的Broadcast实例的分配/更新方法.该dictionary变量来自Web服务,channels并programs包含由Web服务标识符索引的故障通道和程序对象.断层发生在self.program = program和self.channel = channel线上.
- (BOOL)assignWithDictionary:(NSDictionary *)dictionary channels:(NSDictionary *)channels programs:(NSDictionary *)programs {
// Add channel relationship
NSNumber *channelIdentifier = [dictionary objectForKey:@"channel_id"];
if (self.channel == nil || ![self.channel.identifier isEqualToNumber:channelIdentifier]) {
Channel *channel = [channels objectForKey:channelIdentifier];
if (channel == nil) {
NSLog(@"Broadcast %@ has invalid channel: %@", identifier, channelIdentifier);
return NO;
}
self.channel = channel;
}
// Same to add a program relationship
// ...
}
Run Code Online (Sandbox Code Playgroud)
我获取频道或节目列表的获取请求:
- (NSDictionary *)itemsForEntity:(NSEntityDescription *)entity {
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
NSError *error = nil;
NSArray *itemsArray = nil;
request.entity = entity;
request.relationshipKeyPathsForPrefetching = [NSArray arrayWithObject:@"broadcasts", nil];
request.propertiesToFetch = [NSArray arrayWithObjects:@"identifier", @"version", nil];
itemsArray = [self.context executeFetchRequest:request error:&error];
NSAssert1(error == nil, @"Could not fetch the items from the database: %@", error);
{
NSMutableDictionary *items = [NSMutableDictionary dictionaryWithCapacity:itemsArray.count];
for (NSManagedObject *item in itemsArray) {
[items setObject:item forKey:[item valueForKey:@"identifier"]];
}
return [NSDictionary dictionaryWithDictionary:items];
}
}
Run Code Online (Sandbox Code Playgroud)
不太确定你想在这里做什么,但是......
首先,你不能仅使用错误来改变属性。错误只是占位符,允许您测量/计算对象图和行走关系。如果您确实更改了关系,则会引发故障,导致相关对象加载。
如果您尝试仅使用错误来设置特定Channel,Program和Broadcast对象之间的关系,那么这是行不通的。
你的itemsForEntity:方法我没看懂。它将获取传递的实体的每个现有托管对象,然后将在字典中返回这些对象。Program这将导致大量的内存开销,尤其是在对象有 8,000 个的情况下。
propertiesToFetch除非您将获取返回设置为字典,否则您无法使用 ,但您没有这样做。如果需要设置关系,无论如何都不能使用字典返回类型。当您想要的只是某些属性中保存的数据时,可以使用这两种方法。它不是操作对象图关系的工具。
relationshipKeyPathsForPrefetching如果您知道您将访问现有关系,则设置唯一会加快速度。当您首先设置关系时,它没有帮助,例如,如果关系中没有现有对象broadcasts,或者您要添加或删除Broadcast对象,则预取broadcasts键路径对您没有任何帮助。
我不确定我是否足够了解您的数据模型,但我认为您的处理方式是错误的。在我看来,您试图identifier在 SQL 数据库中使用类似主键的方法,但这样做会适得其反。在核心数据中,关系将对象链接在一起,而不是共享属性和值。
通常,如果您有两个或多个对象具有相同的属性名称和相同的值,那么在大多数情况下您的数据模型设计得很差。
| 归档时间: |
|
| 查看次数: |
1630 次 |
| 最近记录: |