2015-11-03 99 views
1

我有一個iPhone和iPad等IOS的項目。對於我使用CoreData來保存用戶在應用中輸入的數據的項目。爲了便於理解,可以說它就像一個聯繫人應用程序。所以基本上你知道你有你的名字,工作,電話等。這個應用程序也存儲每個「聯繫人」的圖像。當然可選。爲防止數據庫效率低下,我使用下面的代碼將路徑存儲到DocumentsDirectory中。該圖像通過使用ManagedObjects id來調用,該id也是圖像名稱中使用的名稱。但是,多個對象可以具有相同的ID,這會導致一些問題。CoreData iOS - 如何爲對象創建唯一的ID?

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,  NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *savedImagePath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"Person%i.jpg",[[_detailItem id] intValue]]]; 

基本上我正在使用人的id的形象。但是,多人可以擁有相同的ID(一個int-32)。而不是這樣做,我想知道是否有CoreData創建的方式或可以爲存儲的每個對象創建唯一標識。這樣,如果我改變它不會失去它的圖片,或者如果另一個對象具有相同的ID它不會使用相同的圖片。

有些數據庫像我以前使用的MySQL有一個屬性選項,它可以爲用戶/論壇/帖子/ etc等提供一個唯一的ID ...在XCode的CoreData中是否有類似的東西?我不願意通過解析每個對象來得到一個尚未被使用的數字。

回答

5

像MySQL的我用一些數據庫...

停止想使用MySQL的核心數據時。這樣做只會導致問題。

被管理對象有一個唯一的ID字段,您可以使用objectID來查找類型NSManagedObjectID。這是一個不透明的類,但您可以使用其URIRepresentation方法將其轉換爲NSURL。從那裏你可以將它轉換爲一個字符串,並將其用於圖像文件名。

只要您只使用一臺設備,這些ID就是唯一的。如果您在設備之間同步數據,則一臺設備上的ID與另一臺設備上的ID不匹配。該ID用於Core Data的內部使用,並且僅在相同的持久性存儲文件中保持一致。

如果你真的想要一個整數,你必須自己維護它。將最新整數的值存儲在用戶默認值中或存儲在持久性存儲文件的元數據中。當你創建一個新的實例時,你需要讀取整數,增加它,將它用於新的實例,並保存新的值。

更簡單的方法是將UUID用於唯一ID。通過這樣做,得到一個新的唯一ID:

NSString *newID = [[NSUUID UUID] UUIDString]; 

商店,作爲一個屬性,並用它作爲圖像文件名的一部分。

0

核心數據沒有辦法自動執行此操作。您可以解析(永久)objectID的字符串形式以獲取Core Data的唯一標識符。更好的選擇是將您的ID改爲字符串並使用UUID。

+0

描述當已經有答案了,投零以上,爲什麼國防部下來其他的答案,尤其是當其他人給出了基本相同的答案?所有的答案都是在大約同一時間給出的,所以我們甚至不會互相重複。對我來說這似乎很小。 (順便說一下,我給湯姆的回答提供了第一張票,因爲我發佈了我的票後看到了它,這樣更好,那還是沒有理由懲罰我和馬修。) – Avi

-1

我建議創建自己的uniqueId屬性,並且用類似CFUUID填充它,更詳細here