1. 程式人生 > >CoreData專案執行時報錯:無法解碼root key

CoreData專案執行時報錯:無法解碼root key

支援CoreData的App執行時報錯了:

<NSSQLObjectFaultRequestContext: 0x6000004a1080> , *** -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (DateRange) for key (root); the class may be defined in source code or a library that is not linked with userInfo of {
    "__NSCoderInternalErrorCode" = 4864;
}

下面還有更進一步的錯誤:

Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: '*** -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (DateRange) for key (root); the class may be defined in source code or a library that is not linked'

從中大致可以看到原因是root key對應的類DateRange無法被解碼導致的!

我們知道CoreData在儲存資料時會將其型別名稱也一併儲存,如果你在後來改變了類名稱,自然會崩。

但是回想一下,我並沒有改變任何Swift類的名稱啊!!!

wait!但我的確修改了對應Swift類匯出到ObjC類的名稱:

@objc(HyDateRange)  //原來是DateRange!
public class HyDateRange:NSObject,NSCopying,NSCoding{}

所以我們得出了:對於CoreData中的託管類,最終儲存的是其ObjC類中的名稱,這可能是因為CoreData的實際底層功能還是用ObjC來完成的。

解決辦法是將App刪除,讓其自行重新建立資料庫就可以了。