Erste Schritte mit Core Data Tutorial

Dies ist ein gekürztes Kapitel aus unserem Buch Core Data by Tutorials, das für Swift 4.2 und iOS 12 vollständig aktualisiert wurde. Dieses Tutorial wird als Teil unserer iOS 12 Launch Party präsentiert – viel Spaß!

Willkommen bei Core Data!

In diesem Tutorial schreiben Sie Ihre allererste Core Data-App. Sie werden sehen, wie einfach es ist, mit allen in Xcode bereitgestellten Ressourcen zu beginnen, von Starter-Codevorlagen bis zum Datenmodelleditor.

Sie werden von Anfang an auf dem Laufenden sein. Am Ende des Tutorials werden Sie wissen, wie:

  • Modelldaten mit dem Xcode-Modelleditor
  • Neue Datensätze zu Core Data hinzufügen
  • Eine Reihe von Datensätzen aus Core Data abrufen
  • Zeigen Sie die abgerufenen Datensätze in einer Tabellenansicht an.

Sie erhalten auch einen Eindruck davon, was Core Data hinter den Kulissen macht und wie Sie mit den verschiedenen beweglichen Teilen interagieren können.

Erste Schritte

Öffnen Sie Xcode und erstellen Sie ein neues iOS-Projekt basierend auf der Single View App-Vorlage. Benennen Sie die App-Hitliste und stellen Sie sicher, dass Core Data verwenden aktiviert ist.

Wenn Sie das Kontrollkästchen Kerndatenverwenden aktivieren, generiert Xcode in AppDelegate einen Boilerplate-Code für das, was als NSPersistentContainer in AppDelegate .rasch.

Der NSPersistentContainer besteht aus einer Reihe von Objekten, die das Speichern und Abrufen von Informationen aus Kerndaten erleichtern. In diesem Container befindet sich ein Objekt zum Verwalten des Kerndatenstatus als Ganzes, ein Objekt, das das Datenmodell darstellt, und so weiter.

Der Standardstapel funktioniert für die meisten Apps gut, aber abhängig von Ihrer App und ihren Datenanforderungen können Sie den Stapel effizienter anpassen.

Hinweis: Nicht alle Xcode-Vorlagen unter iOS ▸ Anwendung haben die Option, mit Core Data zu beginnen. In Xcode 10 verfügen nur die Vorlagen Master-Detail-App und Einzelansicht-App über das Kontrollkästchen Kerndaten verwenden.

Die Idee für diese Beispiel-App ist einfach: Es wird eine Tabellenansicht mit einer Liste von Namen für Ihre eigene „Trefferliste“ geben. Sie können dieser Liste Namen hinzufügen und schließlich Core Data verwenden, um sicherzustellen, dass die Daten zwischen den Sitzungen gespeichert werden. Wir dulden keine Gewalt auf dieser Seite, so dass Sie diese App als Favoritenliste betrachten können, um natürlich auch Ihre Freunde im Auge zu behalten!

Klicken Sie auf Main.storyboard, um es im Interface Builder zu öffnen. Wählen Sie den Ansichtscontroller auf der Leinwand aus und betten Sie ihn in einen Navigationscontroller ein. Wählen Sie im Editor-Menü von Xcode die Option Einbetten in … ▸ Navigationscontroller.

Klicken Sie auf die Navigationsleiste des Navigationscontrollers, um ihn auszuwählen, und klicken Sie dann im Attributinspektor auf die großen Titel. Dadurch erhält die Beispiel-App einen Titelstil, der den Standard-Apps von Apple entspricht.

Ziehen Sie als Nächstes eine Tabellenansicht aus der Objektbibliothek in den View Controller und ändern Sie die Größe, sodass sie die gesamte Ansicht abdeckt.

Wenn noch nicht geöffnet, verwenden Sie das Symbol in der unteren linken Ecke Ihres Canvas, um die Dokumentkontur von Interface Builder zu öffnen.

Ziehen Sie bei gedrückter Strg-Taste von der Tabellenansicht in der Dokumentkontur in die übergeordnete Ansicht und wählen Sie die Einschränkung Führender Leerzeichen für den sicheren Bereich aus:

Tun Sie dies noch dreimal, indem Sie die Einschränkungen auswählen Hinterer Raum zum sicheren Bereich, Oberer Raum zum sicheren Bereich und schließlich Unterer Raum zum sicheren Bereich. Durch Hinzufügen dieser vier Einschränkungen füllt die Tabellenansicht die übergeordnete Ansicht.

Ziehen Sie als Nächstes ein Balkenschaltflächenelement und platzieren Sie es in der Navigationsleiste des View Controllers. Wählen Sie abschließend das Element bar button aus und ändern Sie das Systemelement in Add.

Ihre Leinwand sollte ähnlich wie im folgenden Screenshot aussehen:

Jedes Mal, wenn Sie auf die Schaltfläche Hinzufügen tippen, wird eine Warnmeldung mit einem Textfeld angezeigt. Von dort aus können Sie den Namen einer Person in das Textfeld eingeben. Wenn Sie auf Save tippen, wird der Name gespeichert, der Alert-Controller geschlossen und die Tabellenansicht aktualisiert, wobei alle eingegebenen Namen angezeigt werden.

Aber zuerst müssen Sie den View Controller zur Datenquelle der Tabellenansicht machen. Ziehen Sie in der Arbeitsfläche bei gedrückter Strg-Taste von der Tabellenansicht auf das gelbe View Controller-Symbol über der Navigationsleiste, wie unten gezeigt, und klicken Sie auf DataSource:

Falls Sie sich fragen, müssen Sie den Delegaten der Tabellenansicht nicht einrichten, da das Tippen auf die Zellen keine Aktion auslöst. Einfacher geht es nicht!

Öffnen Sie den Assistenten-Editor, indem Sie Befehlstaste-Wahltaste-Eingabetaste drücken oder die mittlere Schaltfläche im Editor-Toolset in der Xcode-Leiste auswählen.

Ziehen Sie bei gedrückter Strg-Taste aus der Tabellenansicht auf ViewController.swift innerhalb der Klassendefinition, um ein IBOutlet zu erstellen.

Als nächstes benennen Sie die neue IBOutlet -Eigenschaft tableView, was zu der folgenden Zeile führt:

@IBOutlet weak var tableView: UITableView!

Ziehen Sie anschließend bei gedrückter Strg-Taste von der Schaltfläche Hinzufügen in ViewController.swift direkt unter Ihrer viewDidLoad() Definition. Erstellen Sie dieses Mal eine Aktion anstelle eines Ausgangs und benennen Sie die Methode addName mit einem Typ UIBarButtonItem:

@IBAction func addName(_ sender: UIBarButtonItem) { }

Sie können jetzt im Code auf die Tabellenansicht und die Aktion des Balkenschaltflächenelements verweisen.

Als Nächstes richten Sie das Modell für die Tabellenansicht ein. Fügen Sie ViewController die folgende Eigenschaft hinzu.swift unterhalb der tableView IBOutlet:

var names: = 

names ist ein veränderliches Array mit Zeichenfolgenwerten, die in der Tabellenansicht angezeigt werden. Ersetzen Sie als Nächstes die Implementierung von viewDidLoad() durch Folgendes:

override func viewDidLoad() { super.viewDidLoad() title = "The List" tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")}

Dadurch wird ein Titel in der Navigationsleiste festgelegt und die Klasse UITableViewCell in der Tabellenansicht registriert.

Hinweis: register(_:forCellReuseIdentifier:) garantiert, dass Ihre Tabellenansicht eine Zelle des richtigen Typs zurückgibt, wenn der Cell reuseIdentifier für die dequeue -Methode bereitgestellt wird.

Als nächstes noch im ViewController.swift, fügen Sie die folgende UITableViewDataSource Erweiterung unter Ihrer Klassendefinition für ViewController:

// MARK: - UITableViewDataSourceextension ViewController: UITableViewDataSource { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return names.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) cell.textLabel?.text = names return cell }}

Wenn Sie jemals mit UITableView gearbeitet haben, sollte dieser Code sehr vertraut aussehen. Zuerst geben Sie die Anzahl der Zeilen in der Tabelle als Anzahl der Elemente in Ihrem names -Array zurück.

Als Nächstes hebt tableView(_:cellForRowAt:) die Warteschlange für Tabellenansichtszellen auf und füllt sie mit der entsprechenden Zeichenfolge aus dem Array names.

Als nächstes müssen Sie neue Namen hinzufügen, damit die Tabellenansicht sie anzeigen kann. Implementieren Sie die addName IBAction -Methode, die Sie zuvor mit gedrückter Strg-Taste in Ihren Code gezogen haben:

// Implement the addName IBAction@IBAction func addName(_ sender: UIBarButtonItem) { let alert = UIAlertController(title: "New Name", message: "Add a new name", preferredStyle: .alert) let saveAction = UIAlertAction(title: "Save", style: .default) { action in guard let textField = alert.textFields?.first, let nameToSave = textField.text else { return } self.names.append(nameToSave) self.tableView.reloadData() } let cancelAction = UIAlertAction(title: "Cancel", style: .cancel) alert.addTextField() alert.addAction(saveAction) alert.addAction(cancelAction) present(alert, animated: true)}

Jedes Mal, wenn Sie auf die Schaltfläche Hinzufügen tippen, wird bei dieser Methode ein UIAlertController mit einem Textfeld und zwei Schaltflächen angezeigt: Speichern und Abbrechen.

Speichern fügt den aktuellen Text der Textfelder in das Array names ein und lädt dann die Tabellenansicht neu. Da das Array names das Modell ist, das die Tabellenansicht unterstützt, wird alles, was Sie in das Textfeld eingeben, in der Tabellenansicht angezeigt.

Schließlich erstellen und führen Sie Ihre App zum ersten Mal aus. Tippen Sie anschließend auf die Schaltfläche Hinzufügen. Der Alert Controller sieht folgendermaßen aus:

Fügen Sie der Liste vier oder fünf Namen hinzu. Sie sollten etwas Ähnliches wie unten sehen:

Ihre Tabellenansicht zeigt die Daten an und Ihr Array speichert die Namen, aber das Große, was hier fehlt, ist die Persistenz. Wenn Sie jedoch das Beenden der App erzwingen oder Ihr Gerät neu starten, wird Ihre Trefferliste gelöscht. Core Data bietet Persistenz, d. h. es kann Daten in einem dauerhafteren Zustand speichern, sodass es einen App-Neustart oder einen Neustart des Geräts überleben kann.

Sie haben noch keine Kerndatenelemente hinzugefügt, sodass nach dem Verlassen der App nichts mehr bestehen bleiben sollte. Lassen Sie uns das testen. Drücken Sie die Home-Taste, wenn Sie ein physisches Gerät verwenden, oder die entsprechende Taste (Umschalt + ⌘ + H), wenn Sie den Simulator verwenden. Dadurch gelangen Sie zurück zum vertrauten App-Raster auf dem Startbildschirm:

Tippen Sie auf dem Startbildschirm auf das Hitlisten-Symbol, um die App wieder in den Vordergrund zu rücken. Die Namen sind immer noch auf dem Bildschirm. Was passierte?

Wenn Sie auf die Home-Taste tippen, wechselt die App, die sich derzeit im Vordergrund befindet, in den Hintergrund. In diesem Fall friert das Betriebssystem alles ein, was sich derzeit im Speicher befindet, einschließlich der Zeichenfolgen im Array names. Wenn es Zeit ist, aufzuwachen und in den Vordergrund zurückzukehren, stellt das Betriebssystem das wieder her, was sich früher im Speicher befand, als ob Sie es nie verlassen hätten.

Apple hat diese Fortschritte beim Multitasking bereits in iOS 4 eingeführt. Sie schaffen eine nahtlose Erfahrung für iOS-Benutzer, fügen jedoch der Definition von Persistenz für iOS-Entwickler eine Falte hinzu. Werden die Namen wirklich beibehalten?

Nein, nicht wirklich. Wenn Sie die App im Fast App Switcher vollständig beendet oder Ihr Telefon ausgeschaltet hätten, wären diese Namen verschwunden. Sie können dies auch überprüfen. Mit der App im Vordergrund, geben Sie die schnelle App Switcher. Sie können dies tun, indem Sie entweder doppelt auf die Home-Taste tippen, wenn Ihr Gerät über eine verfügt, oder langsam vom unteren Bildschirmrand nach oben ziehen, wenn Sie sich auf einem iPhone X befinden.

Bewegen Sie von hier aus den HitList-App-Snapshot nach oben, um die App zu beenden. Wenn Sie an einem iPhone X arbeiten, müssen Sie den App-Snapshot lange drücken, bis oben rechts eine rote Löschtaste angezeigt wird.

Nachdem Sie die App aus dem App Switcher entfernt haben, sollte keine Spur von HitList im lebenden Speicher vorhanden sein (kein Wortspiel beabsichtigt). Stellen Sie sicher, dass die Namen verschwunden sind, indem Sie zum Startbildschirm zurückkehren und auf das Hitlisten-Symbol tippen, um einen neuen Start auszulösen.

Der Unterschied zwischen Flash-Freezing und Persistenz kann offensichtlich sein, wenn Sie einige Zeit mit iOS gearbeitet haben und mit der Funktionsweise von Multitasking vertraut sind. Im Kopf eines Benutzers gibt es jedoch keinen Unterschied. Dem Benutzer ist es egal, warum die Namen noch vorhanden sind, ob die App in den Hintergrund getreten und zurückgekehrt ist oder weil die App sie gespeichert und neu geladen hat. Alles, was zählt, ist, dass die Namen immer noch da sind, wenn die App zurückkommt!

Der eigentliche Test der Persistenz ist also, ob Ihre Daten nach einem neuen App-Start noch vorhanden sind.

Modellierung Ihrer Daten

Jetzt wissen Sie, wie Sie auf Persistenz prüfen, und können in Core Data eintauchen. Ihr Ziel für die Hitlisten-App ist einfach: Behalten Sie die eingegebenen Namen bei, damit sie nach einem neuen App-Start angezeigt werden können.

Bis zu diesem Zeitpunkt haben Sie einfache alte Swift-Zeichenfolgen verwendet, um die Namen im Speicher zu speichern. In diesem Abschnitt ersetzen Sie diese Zeichenfolgen durch Core Data-Objekte.

Der erste Schritt besteht darin, ein verwaltetes Objektmodell zu erstellen, das beschreibt, wie Core Data Daten auf der Festplatte darstellt.

Standardmäßig verwendet Core Data eine SQLite-Datenbank als persistenten Speicher, sodass Sie sich das Datenmodell als Datenbankschema vorstellen können.

Hinweis: Beim Umgang mit Core Data stoßen Sie häufig auf das Wort verwaltet. Wenn im Namen einer Klasse „verwaltet“ angezeigt wird, z. B. in NSManagedObjectContext, handelt es sich wahrscheinlich um eine Core Data-Klasse. „Verwaltet“ bezieht sich auf die Verwaltung des Lebenszyklus von Core Data-Objekten durch Core Data.

Gehen Sie jedoch nicht davon aus, dass alle Kerndatenklassen das Wort „verwaltet“ enthalten. Eine umfassende Liste der Core Data-Klassen finden Sie in der Core Data Framework-Referenz im Dokumentationsbrowser.

Da Sie sich für die Verwendung von Core Data entschieden haben, hat Xcode automatisch eine Datenmodelldatei für Sie erstellt und diese HitList genannt.xcdatamodeld.

Hitliste öffnen.xcdatamodeld. Wie Sie sehen, verfügt Xcode über einen leistungsstarken Datenmodelleditor:

Der Datenmodelleditor verfügt über viele Funktionen, die Sie später erkunden können. Konzentrieren wir uns zunächst auf die Erstellung einer einzelnen Core Data-Entität.

Klicken Sie unten links auf Entität hinzufügen, um eine neue Entität zu erstellen. Doppelklicken Sie auf die neue Entität und ändern Sie ihren Namen in Person:

Sie fragen sich vielleicht, warum der Modelleditor den Begriff Entity. verwendet, wenn Sie nicht einfach eine neue Klasse definiert haben? Wie Sie in Kürze sehen werden, verfügt Core Data über ein eigenes Vokabular. Hier finden Sie einen kurzen Überblick über einige Begriffe, denen Sie häufig begegnen:

  • Eine Entität ist eine Klassendefinition in Core Data. Das klassische Beispiel ist ein Employee oder ein Company. In einer relationalen Datenbank entspricht eine Entität einer Tabelle.
  • Ein Attribut ist eine Information, die an eine bestimmte Entität angehängt ist. Beispielsweise könnte eine Employee -Entität Attribute für die name, position und salary des Mitarbeiters haben. In einer Datenbank entspricht ein Attribut einem bestimmten Feld in einer Tabelle.
  • Eine Beziehung ist eine Verbindung zwischen mehreren Entitäten. In Core Data werden Beziehungen zwischen zwei Entitäten als Zu-Eins-Beziehungen bezeichnet, während Beziehungen zwischen einer und vielen Entitäten als Zu-Viele-Beziehungen bezeichnet werden. Zum Beispiel kann ein Manager eine Zu-Viele-Beziehung zu einer Gruppe von Mitarbeitern haben, während eine Person Employee normalerweise eine Zu-Eins-Beziehung zu ihrem Manager hat.
Hinweis: Sie haben wahrscheinlich bemerkt, dass Entitäten sehr nach Klassen klingen. Ebenso klingen Attribute und Beziehungen sehr nach Eigenschaften. Was ist der Unterschied? Sie können sich eine Core Data-Entität als Klassendefinition und das verwaltete Objekt als Instanz dieser Klasse vorstellen.

Jetzt wissen Sie, was ein Attribut ist, Sie können ein Attribut hinzufügen Person Objekt zuvor erstellt. Immer noch in der Hitliste.xcdatamodeld, wählen Sie Person auf der linken Seite und klicken Sie auf das Pluszeichen (+) unter Attribute.

Setzen Sie den Namen des neuen Attributs auf, er, name und ändern Sie den Typ in String:

In Core Data kann ein Attribut eines von mehreren Datentypen sein.

Speichern in Kerndaten

Öffnen Sie ViewController.fügen Sie dann den folgenden Core Data Module-Import unter dem UIKit -Import hinzu:

import CoreData

Dieser Import ist alles, was Sie brauchen, um die Core Data API in Ihrem Code zu verwenden.

Ersetzen Sie als Nächstes die Eigenschaftsdefinition names durch die folgende:

var people: = 

Sie speichern Person Entitäten anstelle von Zeichenfolgennamen, sodass Sie das Array, das als Datenmodell der Tabellenansicht dient, in people umbenennen. Es enthält jetzt Instanzen von NSManagedObject anstelle von einfachen Zeichenfolgen.

NSManagedObject stellt ein einzelnes Objekt dar, das in Core Data gespeichert ist. Wie Sie in Kürze sehen werden, ist NSManagedObject ein Formwandler. Es kann die Form einer beliebigen Entität in Ihrem Datenmodell annehmen und die von Ihnen definierten Attribute und Beziehungen übernehmen.

Da Sie das Modell der Tabellenansicht ändern, müssen Sie auch beide zuvor implementierten Datenquellenmethoden ersetzen. Ersetzen Sie Ihre UITableViewDataSource -Erweiterung durch Folgendes:

// MARK: - UITableViewDataSourceextension ViewController: UITableViewDataSource { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return people.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let person = people let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) cell.textLabel?.text = person.value(forKeyPath: "name") as? String return cell }}

Die bedeutendste Änderung dieser Methoden tritt in tableView(_:cellForRowAt:) auf. Anstatt Zellen mit der entsprechenden Zeichenfolge im Modellarray abzugleichen, ordnen Sie jetzt Zellen mit dem entsprechenden NSManagedObject .

Beachten Sie, wie Sie das Attribut name aus dem Attribut NSManagedObject abrufen. Es passiert hier:

cell.textLabel?.text = person.value(forKeyPath: "name") as? String

Warum musst du das tun? Wie sich herausstellt, kennt NSManagedObject das name -Attribut, das Sie in Ihrem Datenmodell definiert haben, nicht, sodass Sie nicht direkt mit einer Eigenschaft darauf zugreifen können. Die einzige Möglichkeit, Core Data zum Lesen des Werts bereitzustellen, ist die Schlüssel-Wert-Codierung, die allgemein als KVC bezeichnet wird.

Hinweis: KVC ist ein Mechanismus in Foundation für den indirekten Zugriff auf die Eigenschaften eines Objekts mithilfe von Zeichenfolgen. In diesem Fall führt KVC dazu, dass sich NSMangedObject zur Laufzeit wie ein Wörterbuch verhält.

Die Schlüssel-Wert-Codierung ist für alle Klassen verfügbar, die von NSObject erben, einschließlich NSManagedObject. Sie können mit KVC nicht auf Eigenschaften eines Swift-Objekts zugreifen, das nicht von NSObject stammt.

Suchen Sie als Nächstes addName(_:) und ersetzen Sie save UIAlertAction durch Folgendes:

let saveAction = UIAlertAction(title: "Save", style: .default) { action in guard let textField = alert.textFields?.first, let nameToSave = textField.text else { return } self.save(name: nameToSave) self.tableView.reloadData()}

Dies nimmt den Text im Textfeld und übergibt ihn an eine neue Methode namens save(name:) . Xcode beschwert sich, weil save(name:) noch nicht existiert. Fügen Sie es unten hinzu addName(_:):

func save(name: String) { guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return } // 1 let managedContext = appDelegate.persistentContainer.viewContext // 2 let entity = NSEntityDescription.entity(forEntityName: "Person", in: managedContext)! let person = NSManagedObject(entity: entity, insertInto: managedContext) // 3 person.setValue(name, forKeyPath: "name") // 4 do { try managedContext.save() people.append(person) } catch let error as NSError { print("Could not save. \(error), \(error.userInfo)") }}

Hier setzt Core Data an! Hier ist, was der Code tut:

  1. Bevor Sie etwas aus Ihrem Core Data Store speichern oder abrufen können, müssen Sie zunächst einen NSManagedObjectContext in die Hände bekommen. Sie können einen verwalteten Objektkontext als In-Memory- „Scratchpad“ für die Arbeit mit verwalteten Objekten betrachten.

    Stellen Sie sich das Speichern eines neuen verwalteten Objekts in Core Data als einen zweistufigen Prozess vor: Zuerst fügen Sie ein neues verwaltetes Objekt in einen verwalteten Objektkontext ein; Sobald Sie zufrieden sind, „übernehmen“ Sie die Änderungen in Ihrem verwalteten Objektkontext, um sie auf der Festplatte zu speichern.

    Xcode hat bereits einen verwalteten Objektkontext als Teil der Vorlage des neuen Projekts generiert. Denken Sie daran, dass dies nur geschieht, wenn Sie zu Beginn das Kontrollkästchen Core Data verwenden aktivieren. Dieser Standardkontext für verwaltete Objekte lebt als Eigenschaft von NSPersistentContainer im Anwendungsdelegaten. Um darauf zuzugreifen, erhalten Sie zuerst einen Verweis auf den App-Delegaten.

  2. Sie erstellen ein neues verwaltetes Objekt und fügen es in den Kontext des verwalteten Objekts ein. Sie können dies in einem Schritt mit der statischen Methode NSManagedObject tun: entity(forEntityName:in:) .

    Sie fragen sich vielleicht, worum es bei einem NSEntityDescription geht. Denken Sie daran, dass NSManagedObject früher als Formwandlerklasse bezeichnet wurde, da sie jede Entität darstellen kann. Eine Entitätsbeschreibung ist der Teil, der die Entitätsdefinition aus Ihrem Datenmodell zur Laufzeit mit einer Instanz von NSManagedObject verknüpft.

  1. Mit einem NSManagedObject in der Hand legen Sie das Attribut name mithilfe der Schlüssel-Wert-Codierung fest. Sie müssen den KVC-Schlüssel (in diesem Fall name ) genau so buchstabieren, wie er in Ihrem Datenmodell angezeigt wird.
  2. Sie übernehmen Ihre Änderungen in person und speichern sie auf der Festplatte, indem Sie save im Kontext des verwalteten Objekts aufrufen. Hinweis save kann einen Fehler auslösen, weshalb Sie ihn mit dem Schlüsselwort try in einem Block do-catch aufrufen. Fügen Sie schließlich das neue verwaltete Objekt in das Array people ein, damit es beim erneuten Laden der Tabellenansicht angezeigt wird.

Das ist etwas komplizierter als die Verwendung eines Arrays von Strings, aber nicht so schlimm. Ein Teil des Codes hier, z. B. das Abrufen des Kontexts und der Entität des verwalteten Objekts, kann nur einmal in Ihrem eigenen init() oder viewDidLoad() und später wiederverwendet werden. Der Einfachheit halber tun Sie alles auf die gleiche Weise.

Erstellen und führen Sie die App aus und fügen Sie der Tabellenansicht einige Namen hinzu:

Wenn die Namen tatsächlich in Core Data gespeichert sind, sollte die Hitlisten-App den Persistenztest bestehen. Gehen Sie mit der App im Vordergrund zum Fast App Switcher und beenden Sie ihn.

Tippen Sie im Sprungbrett auf die Hitlisten-App, um einen neuen Start auszulösen. Warte, was ist passiert? Die Tabellenansicht ist leer:

Sie haben in Core Data gespeichert, aber nach einem neuen App-Start ist das Array people leer! Das liegt daran, dass die Daten auf der Festplatte auf Sie warten, aber Sie zeigen sie noch nicht an.

Abrufen von Kerndaten

Um Daten aus Ihrem persistenten Speicher in den Kontext verwalteter Objekte abzurufen, müssen Sie sie abrufen. Öffnen Sie ViewController.swift und fügen Sie Folgendes hinzu viewDidLoad():

override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) //1 guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return } let managedContext = appDelegate.persistentContainer.viewContext //2 let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "Person") //3 do { people = try managedContext.fetch(fetchRequest) } catch let error as NSError { print("Could not fetch. \(error), \(error.userInfo)") }}

Schritt für Schritt macht der Code Folgendes:

  1. Bevor Sie etwas mit Core Data tun können, benötigen Sie einen verwalteten Objektkontext. Fetching ist nicht anders! Wie zuvor rufen Sie den Anwendungsdelegaten auf und greifen auf einen Verweis auf seinen persistenten Container zu, um NSManagedObjectContext in die Hände zu bekommen.
  2. Wie der Name schon sagt, ist NSFetchRequest die Klasse, die für das Abrufen von Kerndaten verantwortlich ist. Fetch-Anfragen sind sowohl leistungsstark als auch flexibel. Sie können Abrufanforderungen verwenden, um eine Reihe von Objekten abzurufen, die die angegebenen Kriterien erfüllen (z. geben Sie mir alle Mitarbeiter, die in Wisconsin leben und mindestens drei Jahre im Unternehmen waren), individuelle Werte (dh geben Sie mir den längsten Namen in der Datenbank) und mehr.

    Abrufanforderungen haben mehrere Qualifikationsmerkmale, die verwendet werden, um die Menge der zurückgegebenen Ergebnisse zu verfeinern. Im Moment sollten Sie wissen, dass NSEntityDescription einer dieser erforderlichen Qualifikationsmerkmale ist.

    Wenn Sie die entity -Eigenschaft einer Abrufanforderung festlegen oder alternativ mit init(entityName:) initialisieren, werden alle Objekte einer bestimmten Entität abgerufen. Dies ist, was Sie hier tun, um alle Person Entitäten abzurufen. Beachten Sie auch, dass NSFetchRequest ein generischer Typ ist. Diese Verwendung von Generika gibt den erwarteten Rückgabetyp einer Abrufanforderung an, in diesem Fall NSManagedObject .

  3. Sie übergeben die Abrufanforderung an den Kontext des verwalteten Objekts, um das schwere Heben durchzuführen. fetch(_:) gibt ein Array verwalteter Objekte zurück, die die in der Abrufanforderung angegebenen Kriterien erfüllen.

Hinweis: Wie save() kann fetch(_:) auch einen Fehler auslösen, sodass Sie ihn innerhalb eines do -Blocks verwenden müssen. Wenn während des Abrufs ein Fehler aufgetreten ist, können Sie den Fehler im Block catch überprüfen und entsprechend reagieren.

Erstellen Sie die Anwendung und führen Sie sie aus. Sofort sollten Sie die Liste der Namen sehen, die Sie zuvor hinzugefügt haben:

Großartig! Sie sind zurück von den Toten (Wortspiel beabsichtigt). Fügen Sie der Liste einige weitere Namen hinzu und starten Sie die App neu, um zu überprüfen, ob das Speichern und Abrufen funktioniert. Wenn Sie die App nicht löschen, den Simulator zurücksetzen oder Ihr Telefon von einem hohen Gebäude werfen, werden die Namen in der Tabellenansicht angezeigt, egal was passiert.

Hinweis: In dieser Beispiel-App gab es einige Ecken und Kanten: sie mussten den Kontext des verwalteten Objekts jedes Mal vom App-Delegaten abrufen, und Sie verwendeten KVC, um auf die Attribute einer Entität zuzugreifen, anstatt auf einen natürlicheren Objektstil person.name .

Schlüsselpunkte

  • Core Data bietet Persistenz auf der Festplatte, was bedeutet, dass Ihre Daten auch nach dem Beenden Ihrer App oder dem Herunterfahren Ihres Geräts zugänglich sind. Dies unterscheidet sich von der In-Memory-Persistenz, bei der Ihre Daten nur so lange gespeichert werden, wie sich Ihre App im Speicher befindet, entweder im Vordergrund oder im Hintergrund.
  • Xcode enthält einen leistungsstarken Datenmodelleditor, mit dem Sie Ihr verwaltetes Objektmodell erstellen können.
  • Ein verwaltetes Objektmodell besteht aus Entitäten, Attributen und Beziehungen
  • Eine Entität ist eine Klassendefinition in Core Data.
  • Ein Attribut ist eine Information, die an eine Entität angehängt ist.
  • Eine Beziehung ist eine Verbindung zwischen mehreren Entitäten.
  • Ein NSManagedObject ist eine Laufzeitdarstellung einer Core Data-Entität. Sie können die Attribute mithilfe der Schlüssel-Wert-Codierung lesen und schreiben.
  • Sie benötigen NSManagedObjectContext bis save() oder fetch(_:) Daten zu und von Core Data.

Wohin von hier aus?

Sie können das abgeschlossene Projekt für dieses Tutorial über die Schaltflächen „Materialien herunterladen“ oben oder unten in diesem Tutorial herunterladen.

In diesem Tutorial haben Sie bereits einige grundlegende Kerndatenkonzepte kennengelernt: Datenmodelle, Entitäten, Attribute, verwaltete Objekte, verwaltete Objektkontexte und Abrufanforderungen.

Wenn Ihnen das, was Sie in diesem Tutorial gelernt haben, gefallen hat, warum schauen Sie sich nicht das vollständige Buch Core Data by Tutorials an, das in unserem Shop erhältlich ist?

Hier ist ein Vorgeschmack auf das, was in dem Buch steht:

1. Kapitel 1, Ihre erste Core Data-App: Sie klicken auf Datei ▸ Neues Projekt und schreiben eine Core Data-App von Grund auf neu! In diesem Kapitel werden die Grundlagen zum Einrichten Ihres Datenmodells und zum Hinzufügen und Abrufen von Datensätzen behandelt.

2. Kapitel 2, NSManagedObject-Unterklassen: NSManagedObject ist die Basisdatenspeicherklasse Ihrer Kerndatenobjektdiagramme. In diesem Kapitel erfahren Sie, wie Sie Ihre eigenen verwalteten Objektunterklassen anpassen, um Daten zu speichern und zu validieren.

3. Kapitel 3, Der Kerndatenstapel: Unter der Haube bestehen Kerndaten aus vielen Teilen, die zusammenarbeiten. In diesem Kapitel erfahren Sie, wie diese Teile zusammenpassen, und entfernen sich von der Starter-Xcode-Vorlage, um Ihr eigenes anpassbares System zu erstellen.

4. Kapitel 4, Zwischenabruf: Ihre Apps rufen ständig Daten ab, und Core Data bietet viele Optionen, um die Daten effizient an Sie zu übermitteln. Dieses Kapitel behandelt erweiterte Abrufanforderungen, Prädikate, Sortierung und asynchrones Abrufen.

5. Kapitel 5, NSFetchedResultsController: Tabellenansichten sind der Kern vieler iOS-Apps, und Apple möchte, dass Core Data gut mit ihnen spielt! In diesem Kapitel erfahren Sie, wie Sie mit NSFetchedResultsController Zeit und Code sparen können, wenn Ihre Tabellenansichten durch Daten aus Core Data gesichert werden.

6. Kapitel 6, Versionierung und Migration: Wenn Sie Ihre App aktualisieren und verbessern, muss sich das Datenmodell mit ziemlicher Sicherheit ändern. In diesem Kapitel erfahren Sie, wie Sie mehrere Versionen Ihres Datenmodells erstellen und dann Ihre Benutzer migrieren, damit sie ihre vorhandenen Daten beim Upgrade beibehalten können.

7. Kapitel 7, Komponententests: Testen ist ein wichtiger Teil des Entwicklungsprozesses, und Sie sollten Core Data nicht auslassen! In diesem Kapitel erfahren Sie, wie Sie eine separate Testumgebung für Core Data einrichten und Beispiele zum Testen Ihrer Modelle sehen.

8. Kapitel 8, Messen und Steigern der Leistung: Niemand hat sich jemals darüber beschwert, dass eine App zu schnell war, daher ist es wichtig, bei der Verfolgung der Leistung wachsam zu sein. In diesem Kapitel erfahren Sie, wie Sie die Leistung Ihrer App mit verschiedenen Xcode-Tools messen und dann einige Tipps zum Umgang mit langsamen Stellen in Ihrem Code erhalten.

9. Kapitel 9, Mehrere verwaltete Objektkontexte: In diesem letzten Kapitel erweitern Sie den üblichen Core Data-Stack um mehrere verwaltete Objektkontexte. Sie erfahren, wie dies die wahrgenommene Leistung verbessern und dazu beitragen kann, dass Ihre App-Architektur weniger monolithisch und kompartimentierter wird.

Und um den Deal zu versüßen, ist die digitale Ausgabe des Buches für $ 44.99 erhältlich! Aber warten Sie nicht — dieser Verkaufspreis ist nur für eine begrenzte Zeit verfügbar.

Apropos süße Angebote, schauen Sie sich unbedingt die tollen Preise an, die wir dieses Jahr mit der iOS 11 Launch Party verlosen, darunter über 9.000 US-Dollar an Werbegeschenken!

Um sich für dieses epische iOS 12-Werbegeschenk zu qualifizieren, müssen Sie lediglich einen Kommentar zum ursprünglichen Startbeitrag hinterlassen und uns mitteilen, welches Buch oder welcher Kurs Ihr Favorit auf dieser Liste ist — oder auf welches kommende Buch oder welchen Kurs Sie sich am meisten freuen!

Wir hoffen, dass Ihnen dieses Update gefällt, und bleiben Sie dran für weitere Buchveröffentlichungen und Updates!

raywenderlich.com Wöchentlich

Die raywenderlich.com newsletter ist der einfachste Weg, um über alles auf dem Laufenden zu bleiben, was Sie als mobiler Entwickler wissen müssen.

Holen Sie sich eine wöchentliche Zusammenfassung unserer Tutorials und Kurse und erhalten Sie als Bonus einen kostenlosen ausführlichen E-Mail-Kurs!

Durchschnittliche Bewertung

4.6/5

Bewertung für diesen Inhalt hinzufügen

Zum Hinzufügen einer Bewertung anmelden

56 Bewertungen

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.