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
Но убедитесь, что вы дали правильное имя классу в инспекторе модели данных. Задание имени класса в инспекторе модели данных.