CoreData專案執行時報錯:無法解碼root key
阿新 • • 發佈:2018-12-16
支援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刪除,讓其自行重新建立資料庫就可以了。