Простая выборка в Swift 3 Core Data
Я пытался реализовать простую функциональность основных данных в моем приложении, чтобы оно показывало учебник (отдельный контроллер представления со страницей прокрутки) только при первой загрузке приложения и обходило его каждый раз. Я начал с синтаксиса из учебных пособий CoreData для Swift 2, но затем мне пришлось настроить его на основе автокоррекции Swift 3 и других учебных пособий, которые помогли мне преодолеть ошибки, которые я обнаружил на этом пути (например, SIGBRT). Текущая проблема, с которой я столкнулся - это ошибка EXC_BAD_INSTRUCTION, которую мне нужно исправить.
У меня есть scrollViewController со следующим кодом:
class ScrollViewController: UIViewController, NSFetchedResultsControllerDelegate {
@IBOutlet var mainScrollView: UIScrollView!
@IBOutlet weak var endTutorial: UIButton!
var imageArray = [UIImage]()
class Person: NSManagedObject {
@NSManaged var tutorialstatus: String?
}
func seed() {
let moc = DataController().managedObjectContext
let entityDes = NSEntityDescription.entity(forEntityName: "Person", in: moc)
let entity = Person(entity: entityDes!, insertInto: moc)
entity.tutorialstatus="test value"
do {
try moc.save()
} catch {
fatalError("Failure to save context: \(error)")
}
}
func fetch() {
let moc = DataController().managedObjectContext
let personFetch = NSFetchRequest<Person>(entityName: "Person")
do {
let fetchedPerson = try moc.fetch(personFetch)
print(fetchedPerson.first!.tutorialstatus)
} catch {
fatalError("Failed to fetch person: \(error)")
}
}
На let fetchedPerson = try moc.fetch(personFetch)
В строке, когда я пытаюсь скомпилировать, я вижу ошибку EXC_BAD_INSTRUCTION (код =EXC_1386_INVOP, субкод =0x0)
Я использую Xcode 8, бета-версию 8. У меня есть быстрый файл с именем 'CoreDataStuf.xcdatamodeld, который имеет сущность с именем "Person" с атрибутом под названием tutorialstatus, который является строкой. Я также дал этой сущности класс Person. У меня также есть файл DataController.swift, где я ссылаюсь на URL CoreDataStuf.
3 ответа
Вот что сработало:
let fetchedPerson = try moc.fetch(personFetch as! NSFetchRequest<NSFetchRequestResult>)
Попробуйте сделать это в контексте moc, как это
@IBOutlet weak var inValue: UITextField!
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
@IBAction func goBtn(_ sender: UIButton) {
var inVal = Int(inValue.text!)!
for i in inVal...inVal + 10 {
context.perform {
let nums = NSEntityDescription.insertNewObject(forEntityName: "Numbers", into: self.context) as! Numbers
let request:NSFetchRequest<Numbers> = Numbers.fetchRequest()
request.predicate = NSPredicate(format: "nums == %d", i)
do { let numbers = try? request.execute()
if (numbers?.count)! > 0 {
print ("Value \(i) alreayd existis")
} else {
nums.nums = Decimal(i) as NSDecimalNumber?
}
} catch let error {
print ("Error while fetching \(error)")
}
}
do {
try self.context.save()
print ("Value stored in DB \(i)")
} catch let error {
print ("Error while saving \(error)")
}
}
}
Пытаться:
let personFetch = NSFetchRequest<NSFetchRequestResult>(entityName: "Person")