2009-02-05 24 views
13

我發現這個美妙的NSManagedObjectID。這對於引用Entity/NSManagedObject/NSEntityDescription非常有用,對吧?
讓我們從實體獲得一個ID:NSManagedObjectID到NSData

NSEntityDescription *entity = [self newEntity];  
NSManagedObjectID *objID = [entity objectID]; 

所以...任何想法如何得到這個objID爲一個字符串?或者更好:NSData。實際上有些東西能夠將它保存到NSUserDefaults中。 ;-)

btw:NSFetchRequest不想在我的情況下工作。我使用此示例的修改版本:answer of an old question

回答

37

得到一個存檔URI對應於NSManagedObjectobjectID

NSManagedObject* myMO; 
... 
NSURL *uri = [[myMO objectID] URIRepresentation]; 
NSData *uriData = [NSKeyedArchiver archivedDataWithRootObject:uri]; 

爲了回到原來的管理對象的實例,您需要與持久化存儲一個CoreData堆棧持有該實例已將添加到NSPersistentStoreCoordinator。然後:

NSData *uriData; 
NSPersistentStoreCoordinator *psc; 
NSManagedObjectContext *moc; //with moc.persistentStoreCoordinator = psc. 
... 
NSURL *uri = [NSKeyedUnarchiver unarchiveObjectWithData:uriData]; 
NSManagedObjectID *moID = [psc managedObjectIDForURIRepresentation:uri]; 
NSManagedObject *myMO = [moc objectWithID:moID]; 
3

你看過URIRepresentation嗎?將NSURL轉換爲NSString並將其轉換爲NSData很容易。

5

從NSManagedObjectID documentation

對象ID可以轉化成其可 封存的 URI表示和後來重新指 回給定對象(使用 managedObjectIDForURIRepresentation: (NSPersistentStoreCoordinator)和 objectWithID: (NSManagedObjectContext)。例如, 應用程序中的最後一個選定組可以存儲在 個用戶默認通過組 對象的ID。您還可以使用對象 ID URI表示來存儲跨越永久性存儲的 (其中沒有可能的硬連接)的「弱」 關係。

只要把它變成一個URL然後把它變成一個字符串或數據。

3

在存檔之前,您不需要將NSURL轉換爲NSString。只需歸檔NSURL即可。

編輯:我最近了解到對象的ID可能會發生變化,例如遷移後。因此,將ID保存到磁盤似乎不是一個好主意,希望以後能夠引用該對象。

0

正如@preston說,不要一的objectID保存到磁盤,而不是:

  1. 讓你的實體一個新的屬性叫做「身份證」
  2. 讓你的實體來說父實體的新屬性稱爲「myEntitysMaxId」
  3. 重寫你的實體來說母公司實現「addNewMyEntityObject:」
  4. 還有,增加「myEntitysMaxId」,並設置該值作爲新的實體來說「ID」
  5. 你什麼時候FETC平時一樣h基於其屬性的實體!

更乾淨更好!

3

這裏是我發現目前做到這一點最乾淨和最簡單的辦法,用4.0增加了setURL和使用getURL方法來避免NSKeyedUnarchiver和的NSKeyedArchiver額外要求:

二傳手:

+ (void)storeSomeObjectId:(NSManagedObjectID *)objectId 
{ 
    [[NSUserDefaults standardUserDefaults] setURL:[objectId URIRepresentation] 
              forKey:@"someObjectIdKey"]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
} 

消氣:

+ (SomeManagedObject *)getObjectByStoredId 
{ 
    NSURL *uri = [[NSUserDefaults standardUserDefaults] URLForKey:@"someObjectIdKey"]; 
    NSManagedObjectID *objectId = [self.persistentStoreCoordinator managedObjectIDForURIRepresentation:uri]; 
    SomeManagedObject *object = [self.managedObjectContext objectWithID:objectId]; 
}