我看到有越來越被管理對象的唯一ID的方法:核心數據:保存唯一對象ID
NSManagedObjectID *moID = [managedObject objectID];
但是,正如我已閱讀,保存時改變。
什麼是創建我自己的唯一ID並將其保存在每個對象中的更好方法,確保它是唯一的並且不會改變?
我看到有越來越被管理對象的唯一ID的方法:核心數據:保存唯一對象ID
NSManagedObjectID *moID = [managedObject objectID];
但是,正如我已閱讀,保存時改變。
什麼是創建我自己的唯一ID並將其保存在每個對象中的更好方法,確保它是唯一的並且不會改變?
我有我的對象創建的日期屬性,所以我剛剛結束了使用日期,包括秒,這似乎對我來說,這將是獨一無二的,工作如何我想要的。
您可以爲您的對象創建一個ID字段,並在init
期間使用GUID
填充它。對於如何創建一個GUID
,並選擇將其導出到串看到UUID (GUID) Support in Cocoa
不要使用'id','description'等名稱來調用對象屬性。 –
您不能將NSManagedObjectID保存在CoreData實體中,並且其中沒有可用作整數或字符串ID的屬性。因此,構建您自己的唯一標識符算法是一個可接受的解決方案,如果您無法跟蹤實體保存時的情況,我爲某些應用程序執行了此操作。
例如,我之前有一個類似的問題,當我需要填充一個UITableView單元格以引用實體,並在單擊/觸摸單元格後檢索實體。
我發現了一個建議使用URI表示,但但是我仍然需要之前保存上下文,但我設法使用NSFetchedResultsController,發現了更堅實的解決方案,而不是應用程序構建ID。
[[myManagedObject objectID] URIRepresentation];
然後你就可以在以後檢索管理對象ID本身:
NSManagedObjectID* moid = [storeCoordinator managedObjectIDForURIRepresentation:[[myManagedObject objectID] URIRepresentation]];
而且隨着模具中我可以檢索你的管理對象。
如果幫助別人尋找這一點,這是我要做的事:
對象
上創建一個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。
這對我來說似乎是這樣一種做事的巧妙方法。使用塊保存它,並指向原始的managedObjectContext,然後設置服務器端標識非常簡潔。 – Rambatino
想到的一個可能的問題是,如果您的應用程序的多個實例碰巧在完全相同的時間(直到第二秒)創建對象,並且這些對象然後上載到服務器端,則ID將發生衝突。否則,簡單(即使有點快速'n'髒) –