【问题标题】:Swift 3 Core Data Forced Downcasting to NSManagedObject SubclassSwift 3 核心数据强制向下转换为 NSManagedObject 子类
【发布时间】:2017-02-06 10:39:41
【问题描述】:

所以我一直在学习和使用CoreData,并且对以下问题感到非常沮丧。当我启动我的应用程序时,我想获取我的CoreData 作为我创建的自定义NSManagedObject 子类。但是强制向下铸造永远不会奏效。我遵循了 Apple 指南。

我的数据如下。下面是自定义的NSManagedObject 子类:

import UIKit
import CoreData
@objc(StudentUniversityData)

class UniversityData: NSManagedObject {
    @NSManaged var universityName:String
    @NSManaged var chineseName:String
    @NSManaged var bottomReadingPercentile:NSNumber
    @NSManaged var bottomMathPercentile:NSNumber
    @NSManaged var topReadingPercentile:NSNumber
    @NSManaged var topMathPercentile:NSNumber
}

这是我创建的代码:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    let managedContext = appDelegate.managedObjectContext
    let studentUniversityFetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "StudentUniversityData")
    studentUniversityFetchRequest.returnsObjectsAsFaults = false    
    do {
        let studentUniversityResults = try managedContext.fetch(studentUniversityFetchRequest)
        savedUniversities = studentUniversityResults as! [UniversityData] // the problem is HERE; this part never works
    } catch let error as NSError {
        print ("Could not fetch \(error), \(error.userInfo)")
    }
}

Here is one picture of my CoreData entity.

Here is another picture of my CoreData entity

无论我尝试做什么,savedUniversities 属性始终为零。

另外,我读到有多个目标会搞砸代码。所以我确保我所有的课程都只有一个目标(我取出了测试和 UItests 目标成员资格)。还是不行。

很抱歉,如果这不是很清楚,因为我很累并且已经解决了这个问题几个小时(没有任何进展)。我读过很多关于 Stack Overflow 的问题,比如:

Unable to find specific subclass of NSManagedObject

CoreData: warning: Unable to load class named

Core Data: Could not cast value of type 'MyType_MyType_2' to MyType

但我还是卡住了。

【问题讨论】:

  • 你确定你的“saveContext()”吗?即您确定要保存数据吗?您无法获取不存在的数据:)
  • 它存在。当我执行“po studentUniversityResults”时,我得到“▿ 10 个元素 - 0 : (entity: StudentUniversityData; id: 0xd000000000040002 ; 数据: { bottomMathPercentile = 500; bottomReadingPercentile = 500; chineseName = "\U5927\U5b66\U4e8c"; topMathPercentile = 750; topReadingPercentile = 750; universityName = "asdf University"; })"
  • 这些细节没有加起来。由于您使用的是as!,因此向下转换应该成功或导致崩溃;结果你不会得到 nil ,除非你向下转换已经为零的东西。如果您使用的是as?,那么 nil 会有意义,但不适用于as!

标签: ios core-data nsmanagedobject


【解决方案1】:

所以我又过了半天就解决了我的问题。

我所做的是将我的核心数据实体重命名为“UniversityData”。这使它与 NSManagedObject 子类“UniversityData”匹配。

名称匹配后一切正常。

似乎很多核心数据只有在名称与您的子类中的所有内容完全匹配时才有效。

【讨论】:

  • 哈哈是的。这就是它在运行时找到它的方式
猜你喜欢
  • 1970-01-01
  • 2017-02-14
  • 2021-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-09
  • 1970-01-01
  • 2016-02-11
相关资源
最近更新 更多