iOS 10. CoreData插入新对象sig ABRT

时间:2016-07-18 01:06:25

标签: swift core-data ios10 xcode8-beta2

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

在我的dataManagerFile中:

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");
    }

在Game + coreDataClass

class Game: NSManagedObject {

}

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

我遇到了运行时错误:&#34;信号SIGABRT&#34;当试图投射到游戏中时:

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

我做错了什么? 您也可以向我推荐一本关于CoreData的好手册,并应用最新的更改吗?

3 个答案:

答案 0 :(得分:3)

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

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

let word = Game(context: managedObjectContext)

它会做正确的事。

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

答案 1 :(得分:1)

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

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

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)
            }

答案 2 :(得分:-1)

首先,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