Persistentes, lokales Speichern von Daten in Swift

Persistentes, lokales Speichern von Daten in Swift

Von am 03.03.2019

Vor kurzem hab ich angefangen meine erste App zu programmieren, und bin ab einem gewissen Punkt darauf gestoßen, dass ich Daten lokal wegspeichern muss. Aber es gibt bei Swift zwei verschiedene Arten Dinge lokal auf dem Gerät zu speichern. Und zwar UserDefaults und CoreData. Ich möchte euch erklären was da der Unterschied ist.

UserDefaults

—> ist ein Interface zur UserDefaults Datenbank wo man Key – Value Paare persistent über das Starten und Schließen der App hinweg speichern kann. Im Grunde erstellt man sich eine Referenz auf das Singelton UserDefaults und speichert sich dann Werte weg. Das ist sinnvoll wenn es um sehr kleine Datenmengen geht, wie zB der Username string, Volume Einstellungen oder Lieblingsfarbe des Users. Da alles in ein einziges plist File gespeichert wird, und das ganze File komplett geladen wird wenn man auch nur einen Value rausholen will, wird das ganze sehr zeit- und rechenaufwendig wenn da eine größere Datenmenge drinnen ist.

Um sich die Daten rauszuholen kann man einfach an der richtigen Stelle

defaults.array(forKey: “Beispielstring”) as! [String]

holen. Man kann alle möglichen Datentypen wie strings, bools oder floats, objects abspeichern und abrufen. Die UserDefaults sind flexibel und einfach zu verwenden, was dazu führt dass sie oft missbraucht werden (für zu große Datenmengen). Es ist gut dazu geeignet wenn es um Kleinigkeiten geht, aber nicht wenn es um wirklich viel Daten geht. UserDefaults ist keine Datenbank. Es wird nur in ein plist eingespeichert. Möchte man viel wegspeichern, kommt CoreData ins Spiel.

CoreData

–> eine SQLite Datenbank

Wenn man beim erstellen des Projektes gleich Core Data mit anklickt, so werden folgende Dinge automatisch hinzugefügt:

  • „name“.xcdatamodeld
  • AppDelegate helper Methoden

Möchte man es im Nachhinein hinzufügen, ist das garnicht so schwer. Man legt einfach ein neues Data Model File an und vergibt einen beliebigen Namen. Wenn man sich die zusätzlichen helper Methoden holen möchte, ist es am einfachsten ein Projekt anzulegen, CoreData anzuklicken und die erstellen zusätzlichen Methoden einfach aus dem AppDelegate.swift File rauszukopieren. Wenn man es rauskopiert, darauf achten dass man den NSPersisentContainer Namen auf den vergebenen Namen im Data Model File umbenennt.

Im Data Model File kann man beliebig viele Entities, also Tabellen (welche dann auch Objekte darstellen) anlegen und deren Beziehung zueinander festlegen. Man kann auch entscheiden ob xCode die Swift classfiles selber erstellen lässt (indem man class Definition rechts im Inspektor auswählt), oder sie selbst schreibt um custom code reinzugeben (Category/Extension). 

Möchte man dann einfach CRUD Aktionen ausführen, wie zB save, ist das auch nicht so schwer. Man muss sich lediglich den Kontext vom AppDelegate holen, in welchen der persistentContainer liegt. Den holt man sich mit: 

let context = (UIApplication.shared.delegate as! AppDelegate).persitentContainer.viewContext

mit 

let newItem = Item(context: context)

erstellt man ein neues Objekt, also Zeile in der Datenbank. Item ist hier der Entityname welcher in dem Data Model File festgelegt wird. Zum Speichern ruft man einfach:

context.save()

auf. Hier darauf achten einen do catch block zu verwenden, und das richtige Errorhandling bereit zu stellen.

Beitrag kommentieren

(*) Pflichtfeld