2011-09-23 99 views
1

我最近處理了一些錯誤,其中我將得到一個異常,提到一個通過URI管理的對象。該URI有點幫助。它看起來有點像x-coredata:// blahblahblahblahblah/EntityName/p22。至少我可以告訴發生了什麼類型的實體,但我還沒有能夠追蹤到特定的對象。到目前爲止,我已經能夠調試這些問題而無需弄清楚。在創建時記錄核心數據NSManagedObject ID的最佳方式是什麼?

我想我可以追蹤它。我可能會打開數據庫並執行SQL查詢,直到找到與URL中的某些內容相匹配的東西。但是,這看起來有點麻煩,如果我必須調試beta測試人員或部署的用戶設備上發生的問題,效率也不是很高。所以我認爲在創建對象時記錄對象ID URI以及我可以識別對象的一些屬性會很好。

應該很簡單吧?剛剛好後,我在我的代碼創建一個對象,我做一個的NSLog類似

NSLog(@"Created Foo instance: %@", [foo.objectID URIRepresentation]); 

唯一的問題是,在我的URI; M越來越不喜歡看上面。他們看起來更像x-coredata:/// EntityName/blahblahblahblahblah。我意識到我可能會獲得臨時ID。

那麼,我該如何將它與永久ID相匹配呢?如果我可以找到一個掛鉤,我只需將日誌消息寫成「Object with temporary ID%@ reassigned permanent ID%@」即可。

+0

我認爲像 「X-coredata:// blahblahblahblahblah /實體名稱/ P22」(P22的部分)是的objectID在CoreData實體(永久的),你可以得到的只是NSLog'ing中的objectID消息 –

+0

以獲得數字ID,您可以只取objectID的最後一部分並去掉alpha部分。也就是說,拿「p22」並得到「22」,這將對應於你的sqlite數據庫中的z_pk –

回答

2

我質疑這個的價值,但它可以通過NSManagedObject本身的兩種方法。

首先,直接在模型或子類中設置一個瞬態NSString。然後覆蓋下面的方法:

- (void)willSave 
{ 
    if (![[self objectID] isTemporaryID]) return; 
    [self setTemporaryIDString:[[[self objectID] URIRepresentation] absoluteString]]; 
} 

- (void)didSave 
{ 
    if (![self temporaryIDString]) return; 

    NSLog(@"%@ moved to %@", [self temporaryIDString], [[[self objectID] URIRepresentation] absoluteString]); 
    [self setTemporaryIDString:nil]; 
} 
+0

如果你質疑它的價值,我可以接受其他關於如何調試引用objectID的異常的建議。 – morningstar

+0

我通常在調試器中捕獲它們並在它們活着時詢問對象。最壞的情況下,我會通過NSLog(@「Object%@」,someMO)將整個對象吐出到控制檯;'' –

0

核心數據NSManagedObject有一個屬性debugDescription,使用它。

NSManagedObject * customer = nil; 

NSLog(@"customer : %@", customer.debugDescription); 
相關問題