ios coredata排序 - 無法找到NSManagedObject的特定子類




relationship教學 swift儲存資料 (12)

這可以幫助那些遇到同樣問題的人。 我是,用Swift 2和Xcode 7 beta 2。

的解決方案是在EntityName.swift註釋掉@objc(EntityName)

我正在開發使用Core Data的應用程序。 當我使用以下方法創建實例時:

let entity = NSEntityDescription.entityForName("User", inManagedObjectContext: appDelegate.managedObjectContext)
let user = User(entity: entity, insertIntoManagedObjectContext: appDelegate.managedObjectContext)

我在日誌中收到警告:

CoreData: warning: Unable to load class named 'User' for entity 'User'.  Class not found, using default NSManagedObject instead.

我怎麼修復它?

還有一個問題,我如何在NSManagedObject子類中定義一個實例方法?

編輯:

我已經在下面的截圖中指定了實體的類:


更新Xcode 7(final):將模塊名稱添加到類中(如Xcode 6和Xcode 7的早期beta版本)不再需要。 Apple文檔實現核心數據管理對象子類已相應更新。

數據模型檢查器現在為實體提供了兩個“類”和“模塊”字段:

當為實體創建Swift託管對象子類時,“模塊”字段設置為“當前產品模塊”,並且使用此設置創建實例既可以在主應用程序中執行,也可以在單元測試中執行。 託管對象子類不能@objc(classname)標記(這在https://.com/a/31288029/1187415中可以看到)。

或者,您可以清空“模塊”字段(它將顯示“無”),並使用@objc(classname)標記託管對象子@objc(classname) (可在https://.com/a/31287260/1187415 @objc(classname) )。

備註:這個答案最初是為Xcode 6編寫的。關於這個問題,各種Xcode 7 beta版本發生了一些變化。 由於它是一個被接受的答案,有許多提議和鏈接,我試圖總結當前Xcode 7最終版本的情況。

我做了我自己的“研究”,並閱讀了這個問題和類似問題CoreData的所有答案:警告:無法加載類名 。 所以歸屬於所有人,即使我沒有專門列出它們!

以前的答案Xcode 6

實現核心數據管理對象子類中所述 ,必須在模型實體檢查器的類字段中將實體類名稱作為模塊名稱的前綴,例如“MyFirstSwiftApp.User”。


這取決於如果你正在運行應用程序vs測試,問題可能在於應用程序正在尋找<appName>.<entityName>並且當它運行時,它看起來像<appName>Tests.<entityName> 。 我現在使用的解決方案(Xcode 6.1)不是在CoreData UI中填充Class字段,而是使用代碼來完成。

此代碼將檢測您是否以App vs Tests身份運行,並使用正確的模塊名稱並更新managedObjectClassName

lazy var managedObjectModel: NSManagedObjectModel = {
    // The managed object model for the application. This property is not optional...
    let modelURL = NSBundle.mainBundle().URLForResource("Streak", withExtension: "momd")!
    let managedObjectModel = NSManagedObjectModel(contentsOfURL: modelURL)!

    // Check if we are running as test or not
    let environment = NSProcessInfo.processInfo().environment as [String : AnyObject]
    let isTest = (environment["XCInjectBundle"] as? String)?.pathExtension == "xctest"

    // Create the module name
    let moduleName = (isTest) ? "StreakTests" : "Streak"

    // Create a new managed object model with updated entity class names
    var newEntities = [] as [NSEntityDescription]
    for (_, entity) in enumerate(managedObjectModel.entities) {
        let newEntity = entity.copy() as NSEntityDescription
        newEntity.managedObjectClassName = "\(moduleName).\(entity.name)"
        newEntities.append(newEntity)
    }
    let newManagedObjectModel = NSManagedObjectModel()
    newManagedObjectModel.entities = newEntities

    return newManagedObjectModel
}()

對這個問題的接受答案幫助我解決了同樣的問題,但我有一個警告,我認為會對其他人有所幫助。 如果您的項目(模塊)名稱中有空格,則必須用下劃線替換空格。 例如:

實體:MyEntity類:My_App_Name.MyClass


如果您在項目名稱中使用連字符(如“My-App”),則使用下劃線而不是像“My_App.MyManagedObject”這樣的連字符。 通常,查看xcdatamodeld文件的名稱並使用與該名稱中相同的前綴。 即“My_App_1.xcdatamodeld”需要前綴“My_App_1”


上面的答案幫助了我,但這可能有助於某人。 如果像我一樣,你做了他們,仍然有問題,記得簡單地'清理你的項目'。 對於XCode8,產品>清潔。 然後再次運行。


記得要刪除你的模塊


我有同樣的警告,雖然我的應用程序似乎運行良好。 問題是,在最後一個屏幕上運行編輯器>創建NSManagedObject子類時,我使用了默認的組位置,沒有顯示或檢查目標,它們將子類保存在MyApp.xcodeproj所在的頂部MyApp目錄中。
當我將組更改為MyApp子文件夾並檢查了MyApp目標時,警告消失了。


順便說一句,你添加的前綴是:我的應用程序被稱為“ABC-def”,Xcode已將“ - ”轉換為“_”。

為了安全查找發現者,找到你的項目文件,看看它對你的數據模型說了什麼(例如“ABC_def.xcdatamodeld”),並使用那裡寫的是什麼!


上面的答案幫助我解決了與Objective-C有關的不同問題(也許它會幫助某人):

如果您重構了實體名稱,請不要忘記在“實用程序面板”中更改“Class”。


就像一個旁注。 我遇到過同樣的問題。 而我所要做的只是在我的課堂文件中添加@objc(ClassName)

例:

@objc(Person)
class Person { }

這解決了我的問題。


NSPersistentContainer有一個viewContext屬性,它是NSManagedObjectContext類型。

另外,如果您在Xcode 8中創建Master-Detail應用程序,Apple的示例代碼會將managedObjectContext屬性放入MasterViewController.swift文件中,並使用AppDelegate中的所述viewContext屬性進行設置。







ios core-data swift nsmanagedobject