【问题标题】:iOS 10. CoreData insert new object sig ABRTiOS 10. Core Data 插入新对象 sigABRT
【发布时间】:2016-11-20 12:12:54
【问题描述】:

我试过 forEntityName: "Game", "MyApp.Game"。

在我的数据管理器文件中:

let appDelegate = UIApplication.shared().delegate as! AppDelegate
                        let container = appDelegate.persistentContainer

                        let managedObjectContext = container.viewContext
                        for item in items {
                            let word = NSEntityDescription.insertNewObject(forEntityName: "MyApp.Game", into: managedObjectContext) as! Game

在游戏+coreDataProperties 文件中

extension Game {

    @nonobjc class func fetchRequest() -> NSFetchRequest<Game> {
        return NSFetchRequest<Game>(entityName: "Game");
    }

在游戏+coreDataClass中

class Game: NSManagedObject {

}

我使用 .xcdatamodeld 为 CoreData 生成了文件:在对象检查器中我指定了名称:“游戏”,类“游戏”,模块“当前产品模块”,代码生成“类定义”,然后我使用编辑器/创建子类,之后我有 3 个文件,我将 codegen 属性设置为“Manual/None”

我在尝试投射到 Game in 时遇到运行时错误:“signal SIGABRT”:

NSEntityDescription.insertNewObject(forEntityName: "MyApp.Game", into: managedObjectContext) as! Game

我做错了什么? 另外,您能否建议我一本关于 CoreData 的好手册,并应用了最新的更改?

【问题讨论】:

    标签: swift core-data ios10 xcode8-beta2


    【解决方案1】:

    首先,目前还没有人更新 iOS 10 Core Data 更改的文档。预计它们将在未来几个月内开始出现(包括 Apple)。

    其次,随着 Core Data 的新变化,您应该不再需要在创建时进行强制转换。理想情况下,您现在可以这样做:

    let word = Game(context: managedObjectContext)
    

    它会做正确的事。

    顺便说一句,您不需要调用实体“MyApp.Game”。它应该只是“游戏”,这可能是你错误的核心。

    【讨论】:

    • 感谢您的回复。 Core Data 有更新,但它们有点缩写))developer.apple.com/library/prerelease/content/releasenotes/… 我希望我可以做 let word = ...,但我得到编译器错误是的,我只是使用了“游戏”
    • Apple 及其文档提供了更多更新。如果你得到编译错误,那么你得到什么编译错误?这表明您的配置/模型/代码某处有问题。
    【解决方案2】:

    终于,我成功了。
    这不是我在 iOS 10 中的 xCode Beta 上使用 CoreData 时遇到的第一个问题。
    因此,这是在 xCode 8 中添加实体的一系列步骤:
    1.创建应用时选择 CoreData 选项,这将创建 youAppName.xcdatamodeld 文件
    2.选择youAppName.xcdatamodeld,添加Entity按钮
    3.添加所需属性
    4. 使用数据模型检查器设置代码生成:
    实体名称“Game”,类名称“GameEntity”,模块“当前产品模块”,codegen“类定义”
    5. cmd + s
    6. 编辑/创建 NSManagedObjectSubclass
    7. 您将获得 3 个新文件:
    GameEntity+CoreDataClass
    GameEntity+CoreProperties
    COREDATA
    8. 注释掉文件“COREDATA...”的内容
    9. youAppName.xcdatamodeld,数据模型检查器,现在当你生成文件后,将可待因属性从“类定义”更改为“手动/无”

    这是一个关于如何添加新对象的代码示例:

    let appDelegate = UIApplication.shared().delegate as! AppDelegate
                            let container = appDelegate.persistentContainer
    
                            let managedObjectContext = container.viewContext
                            for item in items {
                                let game = NSEntityDescription.insertNewObject(forEntityName: "Game", into: managedObjectContext) as! GameEntity
                                game.status = item.status
                                game.rs = item.rs
                                game.score = item.score
    
    
                                do {
                                    try managedObjectContext.save()
    

    这是一个关于如何删除数据的代码示例:

    let appDelegate = UIApplication.shared().delegate as! AppDelegate
            let container = appDelegate.persistentContainer
            let managedObjectContext = container.viewContext
            let fetchRequest: NSFetchRequest<GameEntity> = GameEntity.fetchRequest()
            do {
                let games = try managedObjectContext.fetch(fetchRequest) 
                for game in games {
                    managedObjectContext.delete(game)
                }
    

    【讨论】:

    • 你不应该改变类的生成。它意味着单独放置,Xcode 将保持类文件是最新的(或者如果你这样设置,则保持扩展)。如果您关闭代码生成并更改模型文件,它们将不同步。顺便说一句,您对实体创建施加的力量表明出现了问题。如果您的代码配置正确,您可以创建Game 实体,正如我在回答中提到的那样。
    【解决方案3】:

    首先,Xcode 8 自动生成表示实体所需的类,因此您不必手动创建它们。 而不是:

        let appDelegate = UIApplication.shared().delegate as! AppDelegate
        let container = appDelegate.persistentContainer
        let managedObjectContext = container.viewContext
        for item in items {
             let word = NSEntityDescription.insertNewObject(forEntityName: "MyApp.Game", into: managedObjectContext) as! Game
    

    你可以试试这个:

        let appDelegate = UIApplication.shared().delegate as! AppDelegate
        let container = appDelegate.persistentContainer
        let managedObjectContext = container.viewContext
        for item in items {
            let word = NSEntityDescription.insertNewObject(forEntityName: "Game", into: managedObjectContext) as! Game
    

    但请确保在 Data Model Inspector 中为类提供正确的名称 Setting class name in Data Model Inspector

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多