【发布时间】:2010-08-30 15:49:25
【问题描述】:
我正在编写一个连接到数据库以获取数据的应用程序。由于获取成本高昂且数据通常不会发生变化,因此我使用 CoreData 来缓存结果,以便进行快速的本地查询。
从数据库中,对于每种类型,都有一个保证唯一的字符串属性。实际上,数据库有一个 URI 方案,它是每个项目的唯一地址。
URL 方案是非常基本的:
ngaobject://
/ /
我也希望能够在 CoreData 中使用它。我已经创建了一个从 CoreData 存储中获取单个项目的方法:
-(NSFetchRequest*)fetchRequestForType:(NSString*)typeName identifier:(NSString*)identifier
{
NSFetchRequest * fetchRequest = [self fetchRequestForType:typeName];
[fetchRequest setFetchLimit:1];
NSString * identifierProperty = [self identifierPropertyNameForObjectType:typeName];
NSPredicate * predicate = [NSPredicate predicateWithFormat:@"%K == %@", identifierProperty, identifier];
[fetchRequest setPredicate:predicate];
return fetchRequest;
}
-(NGAObject*)objectWithType:(NSString*)typeName
identifier:(NSString*)identifier
{
// First try to retrieve it from the cache
NSAssert1( (identifier != nil), @"Request to create nil-name object of type %@", typeName );
NSFetchRequest * fetchRequest = [self fetchRequestForType:typeName identifier:identifier];
if ( !fetchRequest )
return nil;
NSError * error = nil;
NSArray * fetchResults = [[self managedObjectContext] executeFetchRequest:fetchRequest error:&error];
if ( !fetchResults )
{
NSLog(@"%@", error);
[NSApp presentError:error];
return nil;
}
if ( [fetchResults count] )
return [fetchResults objectAtIndex:0];
return nil;
}
当我从服务器检索一个项目时,我想首先在缓存中获取对它的引用,如果它在那里,更新它。如果不是,请创建一个新的。
由于我从服务器取回了数千个对象,因此对我知道其唯一 ID 的单个对象执行提取会使我的机器陷入爬网状态。
相反,我正在做的是预加载一个类型的所有对象,然后创建一个标识符字典 -> 对象,然后通过在字典中运行它来处理该类型的数千个对象。这很好用,但很尴尬。
难道我不能编写一个方法来获取类型/标识符组合并从 CoreData 获取单个对象,而不必执行冗长的获取请求吗?
如果我可以让 CoreData 使用我自己的 URI 规范,似乎有一个解决方案。然后我可以在持久存储协调器上调用 -(NSManagedObjectID*)managedObjectIDForURIRepresentation:(NSURL*)url。
那么,问题是,我怎样才能让 CoreData 使用我的 URI 方案?如何让 CoreData 使用我自己的唯一标识符?
【问题讨论】:
标签: cocoa cocoa-touch core-data