In Swift 2 funktionierte der folgende Code:
let request = NSFetchRequest(entityName: String)
aber in Swift 3 gibt es Fehler:
Der generische Parameter "ResultType" konnte nicht abgeleitet werden
weil NSFetchRequest
ist jetzt ein generischer Typ. In ihren Dokumenten haben sie Folgendes geschrieben:
let request: NSFetchRequest<Animal> = Animal.fetchRequest
Wenn meine Ergebnisklasse zum Beispiel ist, Level
wie soll ich dann richtig anfordern?
Weil das nicht funktioniert:
let request: NSFetchRequest<Level> = Level.fetchRequest
let request: NSFetchRequest<Level> = Level.fetchRequest()
let request = Level.fetchRequest()
Antworten:
oder
je nachdem welche version du willst.
Sie müssen den generischen Typ angeben, da der Methodenaufruf ansonsten nicht eindeutig ist.
Die erste Version ist definiert für
NSManagedObject
, die zweite Version wird automatisch für jedes Objekt mit einer Erweiterung generiert, z.Der springende Punkt ist, die Verwendung von String-Konstanten zu entfernen.
quelle
Type 'Project Name' does not conform to protocol 'NSFetchRequestResult'
Ich glaube, ich habe es so gemacht:
Zumindest werden Daten aus der Datenbank gespeichert und geladen.
Aber es fühlt sich so an, als wäre es keine richtige Lösung, aber es funktioniert vorerst.
quelle
Die einfachste Struktur, die ich in 3.0 gefunden habe, lautet wie folgt:
Dabei ist der Datenentitätstyp Land.
Beim Versuch, eine Core Data BatchDeleteRequest zu erstellen, stellte ich jedoch fest, dass diese Definition nicht funktioniert und Sie anscheinend das folgende Formular verwenden müssen:
obwohl die Formate ManagedObject und FetchRequestResult äquivalent sein sollen.
quelle
if #available(iOS 10.0) { ... }
Bedingung verwenden zu müssenHier sind einige generische CoreData-Methoden, die Ihre Frage beantworten könnten:
Angenommen, es gibt ein NSManagedObject-Setup für Contact wie folgt:
Diese Methoden können folgendermaßen verwendet werden:
quelle
NSManagedObjectID
. Also vor demcontext.delete(record)
Hinzufügenlet record = context.object(with: record.objectID)
und Verwenden dieses Datensatzobjekts zum Löschen.Dies ist der einfachste Weg, um auf Swift 3.0 zu migrieren. Fügen Sie einfach hinzu
<Country>
(getestet und gearbeitet)
quelle
Ich hatte auch "ResultType" konnte nicht Fehler abgeleitet werden. Sie wurden gelöscht, sobald ich das Datenmodell neu erstellt und den Codegen jeder Entität auf "Klassendefinition" gesetzt habe. Ich habe hier eine kurze Beschreibung mit schrittweisen Anweisungen gemacht:
Suchen Sie nach einem übersichtlichen Tutorial zum überarbeiteten NSPersistentContainer in Xcode 8 mit Swift 3
Mit "neu erstellt" meine ich, dass ich eine neue Modelldatei mit neuen Einträgen und Attributen erstellt habe. Ein bisschen langweilig, aber es hat funktioniert!
quelle
Was bisher für mich am besten funktioniert hat war:
quelle
Ich hatte das gleiche Problem und löste es mit den folgenden Schritten:
Danach musste ich alle Vorkommen von fetchRequest entfernen / neu schreiben, da XCode sich irgendwie mit der codegenerierten Version zu vermischen scheint.
HTH
quelle
Swift 3.0 Das sollte funktionieren.
quelle