iOS 10.核心数据插入新对象sigABRT

iOS 10. CoreData insert new object sig ABRT

我试过 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

在Game+coreDataProperties文件中

extension Game {

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

游戏+coreDataClass

class Game: NSManagedObject {

}

我使用 .xcdatamodeld 为 CoreData 生成了文件:在对象检查器中我指定了名称:"Game"、Class "Game"、模块 "Current Product Module"、codegen "class definition",然后我使用 Editor/create 子类,在我得到 3 个文件后,我将 codegen 属性 设置为 "Manual/None"

我遇到 运行 时间错误:"signal SIGABRT" 尝试投射到游戏时:

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

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

首先,还没有人更新 iOS 10 核心数据更改的文档。预计他们将在接下来的几个月内开始出现(包括 Apple)。

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

let word = Game(context: managedObjectContext)

它会做正确的事情。

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

我终于成功了。
这不是我在 iOS 10 和 xCode Beta 中使用 CoreData 时遇到的第一个问题。
因此,这是在 xCode 8:
中添加实体的一系列步骤 1.When 创建您的应用选择 CoreData 选项,这将创建 youAppName.xcdatamodeld 文件
2.选择youAppName.xcdatamodeld,添加实体按钮
3. 添加所需属性
4. 使用数据模型检查器设置代码生成:
实体名称 "Game"、Class 名称 "GameEntity"、模块 "Current Product Module"、codegen "class definition"
5. 命令 + s
6. Editor/create NSManagedObjectSubclass
7. 您将获得 3 个新文件:
GameEntity+CoreDataClass
游戏实体+核心属性
COREDATA
8.注释掉文件内容“COREDATA...”
9. youAppName.xcdatamodeld,数据模型检查员,现在当你生成文件时,将 Codeine 属性 从 "class definition" 更改为 "Manual/None"

以下是有关如何添加新对象的代码示例:

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 8 会自动生成表示实体所需的 classes,因此您不必手动创建它们。 而不是:

    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 中为 class 提供正确的名称 Setting class name in Data Model Inspector