我正在寫一個應用程序連接到數據庫來獲取數據。由於取數很昂貴且數據通常不變,因此我使用CoreData來緩存結果,以便我可以快速進行本地查詢。如何獲取核心數據以使用我自己的NSManagedObjectID URI方案?
從數據庫中,對於每種類型,都有一個保證爲唯一的字符串屬性。實際上,數據庫有一個URI方案,它是每個項目的唯一地址。
的URL方案是沿着線非常基本的:
ngaobject:// <server_license_id>/<類型>/<標識符>
我想能夠在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使用我自己的唯一標識符?
不,事實並非如此。這是一個很好的建議,我會試一試。只是爲了這個問題,是否有辦法完成我已經佈置的東西? – 2010-08-30 17:39:42
不確定,這裏的另一個問題似乎不是建議。一般來說,如果你發現自己試圖破解CoreData工作原理的內容,那麼你可能做錯了什麼。在這種情況下,我非常肯定最好的解決方案就是使用表索引,這將是建議的CoreData方法來做到這一點(實際上這將適用於任何RDBMS) – glenc 2010-09-03 19:24:24