2

我尝试了 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 生成了文件:在对象检查器中我指定了名称:“游戏”,类“游戏”,模块“当前产品模块”,代码生成“类定义”,然后我使用编辑器/创建子类,在我得到 3我将 codegen 属性设置为“手动/无”的文件

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

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

我究竟做错了什么?您还可以建议我一本关于 CoreData 的好手册,并应用了最新的更改吗?

4

3 回答 3

3

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

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

let word = Game(context: managedObjectContext)

它会做正确的事情。

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

于 2016-07-18T01:37:03.673 回答
1

最后,我让它工作了。
这不是我在 xCode Beta 上使用 iOS 10 中的 CoreData 时遇到的第一个问题。
因此,这是在 xCode 8 中添加实体的步骤顺序:
1.在创建应用时选择 CoreData 选项,这将创建 youAppName.xcdatamodeld 文件
2.选择 youAppName.xcdatamodeld,添加实体按钮
3.添加所需属性
4.使用数据用于设置代码生成的模型检查器:
实体名称“Game”、类名称“GameEntity”、模块“当前产品模块”、codegen“类定义”
5. cmd + s
6. 编辑器/创建 NSManagedObjectSubclass
7. 您将获得 3 个新文件:



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)
            }
于 2016-07-18T01:51:50.197 回答
-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 中为类提供正确的名称 在 Data Model Inspector 中设置类名

于 2016-07-24T04:59:02.117 回答