iOS 10. CoreData вставить новый объект sig ABRT

Я пытался 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");
    }

в игре +coreDataClass

class Game: NSManagedObject {

}

Я сгенерировал файлы для CoreData, используя.xcdatamodeld: в инспекторе объектов я указал Имя: "Игра", Класс "Игра", Модуль "Модуль текущего продукта", Кодовое определение "Определение класса", затем я использовал подкласс Editor/create, после того как я получил 3 файлы, которые я установил для свойства codegen "Manual/None"

Я получил ошибку во время выполнения: "signal SIGABRT" при попытке привести к Game in:

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

Что я делаю неправильно? Также не могли бы вы посоветовать мне хорошее руководство по CoreData с последними внесенными изменениями?

3 ответа

Решение

Наконец, я сделал это, чтобы работать.
Это не первая проблема, с которой я столкнулся при работе с CoreData в iOS 10 в xCode Beta.
Итак, вот последовательность шагов для добавления ваших сущностей в xCode 8:
1.При создании приложения выберите опцию CoreData, это создаст файл appAame.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, инспектор модели данных, теперь, когда вы создали файлы, измените свойство Codeine с "определения класса" на "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)
            }

Во-первых, никто еще не обновил документацию по изменениям в Core Data для iOS 10. Ожидайте, что они начнут появляться в ближайшие пару месяцев (включая Apple).

Во-вторых, с новыми изменениями в Core Data вам больше не нужно использовать данные при создании. В идеале вы можете теперь просто сделать:

let word = Game(context: managedObjectContext)

И это сделает правильную вещь.

Кстати, вам не нужно вызывать объект "MyApp.Game". Это должна быть просто "Игра", и это, вероятно, суть вашей ошибки.

Прежде всего, 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

Но убедитесь, что вы дали правильное имя классу в инспекторе модели данных. Задание имени класса в инспекторе модели данных.

Другие вопросы по тегам