2011-09-19 93 views
4

我看到有越來越被管理對象的唯一ID的方法:核心數據:保存唯一對象ID

NSManagedObjectID *moID = [managedObject objectID]; 

但是,正如我已閱讀,保存時改變。

什麼是創建我自己的唯一ID並將其保存在每個對象中的更好方法,確保它是唯一的並且不會改變?

回答

6

我有我的對象創建的日期屬性,所以我剛剛結束了使用日期,包括秒,這似乎對我來說,這將是獨一無二的,工作如何我想要的。

+1

這對我來說似乎是這樣一種做事的巧妙方法。使用塊保存它,並指向原始的managedObjectContext,然後設置服務器端標識非常簡潔。 – Rambatino

+0

想到的一個可能的問題是,如果您的應用程序的多個實例碰巧在完全相同的時間(直到第二秒)創建對象,並且這些對象然後上載到服務器端,則ID將發生衝突。否則,簡單(即使有點快速'n'髒) –

3

您可以爲您的對象創建一個ID字段,並在init期間使用GUID填充它。對於如何創建一個GUID,並選擇將其導出到串看到UUID (GUID) Support in Cocoa

+0

不要使用'id','description'等名稱來調用對象屬性。 –

12

您不能將NSManagedObjectID保存在CoreData實體中,並且其中沒有可用作整數或字符串ID的屬性。因此,構建您自己的唯一標識符算法是一個可接受的解決方案,如果您無法跟蹤實體保存時的情況,我爲某些應用程序執行了此操作。

例如,我之前有一個類似的問題,當我需要填充一個UITableView單元格以引用實體,並在單擊/觸摸單元格後檢索實體。

我發現了一個建議使用URI表示,但但是我仍然需要之前保存上下文,但我設法使用NSFetchedResultsController,發現了更堅實的解決方案,而不是應用程序構建ID。

[[myManagedObject objectID] URIRepresentation]; 

然後你就可以在以後檢索管理對象ID本身:

NSManagedObjectID* moid = [storeCoordinator managedObjectIDForURIRepresentation:[[myManagedObject objectID] URIRepresentation]]; 

而且隨着模具中我可以檢索你的管理對象。

1

如果幫助別人尋找這一點,這是我要做的事:

對象

上創建一個ID屬性創建與此代碼的對象時,你得到最後使用的ID:

Playlist *latest; 

// Define entity to use and set up fetch request 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Playlist" inManagedObjectContext:managedObjectContext]; 
NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
[request setEntity:entity]; 


// Define sorting 
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"listID" ascending:NO]; 
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
[request setSortDescriptors:sortDescriptors]; 


// Fetch records and handle errors 
NSError *error; 
NSArray *fetchResults = [managedObjectContext executeFetchRequest:request error:&error]; 

if (!fetchResults) { 
    NSLog(@"ERROR IN FETCHING"); 
} 

if ([fetchResults count] == 0) { 
    latestID = 0; 
} else { 
    latest = [fetchResults objectAtIndex:0]; 
    latestID = latest.listID; 
} 

在新對象上增加1。