Swift - Möglichkeiten Daten zu speichern

Aus Wikizone
Wechseln zu: Navigation, Suche

Einführung

Es gibt mehrere Möglichkeiten, Benutzerdaten wie Notizen oder Einkaufslisten in einer iPhone-App, die in Swift geschrieben ist, zu speichern. Einige der populärsten Optionen sind:

  1. User Defaults: Dies ist eine einfache und einfach zu verwendende Methode zum Speichern von kleinen Mengen an Benutzerdaten. Es speichert Daten im Schlüssel-Wert-Paar-Format und die Daten werden automatisch gespeichert, wenn die App geschlossen wird oder im Hintergrund läuft.
  2. Core Data: Core Data ist ein Framework für objektrelationales Mapping (ORM), mit dem Entwickler auf das Datenmodell der App zugreifen können. Es ist eine leistungsstarke und flexible Lösung zum Speichern und Abrufen großer Datenmengen und bietet Funktionen wie Rückgängig- und Wiederholen-Funktionen, Änderungsverfolgung und Datenvalidierung.
  3. Realm: Realm ist ein von Dritten bereitgestelltes ORM, das Core Data ähnlich ist, aber im Allgemeinen als leichter und schneller gilt.
  4. File I/O: Dies ist die traditionelle Methode zum Speichern von Daten in iOS-Apps. Entwickler können Daten mithilfe des Foundation-Frameworks von und auf das lokale Dateisystem der App lesen und schreiben.
  5. Cloud Service: Durch die Verwendung von Cloud-Service-Anbietern wie AWS, Firebase oder Firestore kann die Daten auf deren Servern gespeichert werden, anstatt auf dem lokalen Gerät. Dieser Ansatz eignet sich, wenn die Daten unter verschiedenen Benutzern geteilt werden oder auf mehreren Geräten zugänglich sein sollen.

Letztlich hängt die Wahl der Methode zum Speichern von Daten von den spezifischen Anforderungen Ihrer App ab, einschließlich der Menge an zu speichernder Daten, der Komplexität des Datenmodells und den Anforderungen an die Datensynchronisierung und Sicherung.

Speichern von JSON Daten mit File I/O

Speichern von Daten mit CoreData

Das Speichern von Instanzen des Structs Setlist in Core Data erfordert einige zusätzliche Schritte im Vergleich zu User Defaults, da Core Data ein umfangreicheres Framework ist. Hier ist ein Beispiel dafür, wie dies mit Swift und Core Data erreicht werden kann: <syntaxhighlight lang="swift"> import CoreData

struct Setlist {

   var title: String = "Default"
   var songs = [Song]()
   var objectID: NSManagedObjectID?
   
   mutating func addSong(title: String, frequency: Float){
       print("Setlist::addSong")
       songs.append(Song(title:title, frequency: frequency))
   }

}

struct Song {

   let title: String
   let frequency: Float

}

// To Save func saveSetlist(_ setlist: Setlist) {

   guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
   let managedContext = appDelegate.persistentContainer.viewContext
   let setlistEntity = NSEntityDescription.entity(forEntityName: "SetlistEntity", in: managedContext)!
   let setlistMO = NSManagedObject(entity: setlistEntity, insertInto: managedContext)
   setlistMO.setValue(setlist.title, forKey: "title")
   
   var songMOs = [NSManagedObject]()
   for song in setlist.songs {
       let songEntity = NSEntityDescription.entity(forEntityName: "SongEntity", in: managedContext)!
       let songMO = NSManagedObject(entity: songEntity, insertInto: managedContext)
       songMO.setValue(song.title, forKey: "title")
       songMO.setValue(song.frequency, forKey: "frequency")
       songMOs.append(songMO)
   }
   setlistMO.setValue(NSOrderedSet(array: songMOs), forKey: "songs")
   setlist.objectID = setlistMO.objectID
   do {
       try managedContext.save()
   } catch let error as NSError {
       print("Could not save. \(error), \(error.userInfo)")
   }

}

// To Retrieve func fetchSetlist(with objectID: NSManagedObjectID) -> Setlist? {

   guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return nil }
   let managedContext = appDelegate.persistentContainer.viewContext
   let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "SetlistEntity")
   fetchRequest.predicate = NSPredicate(format: "self == %@", objectID as CVarArg)
   do {
       let setlistMO = try managedContext.fetch(fetchRequest).first
       guard let title = setlistMO?.value(forKey: "title") as? String, let songsMO = setlistMO?.value(forKey: "songs") as? Set<NSManagedObject> else {
           return nil
       }
       var songs = [Song]()
       forsongMO in songsMO {
            let title = songMO.value(forKey: "title") as? String, let frequency = songMO.value(forKey: "frequency") as? Float else {
                continue
            }
            songs.append(Song(title: title, frequency: frequency))
       }
       var setlist = Setlist(title: title, songs: songs)
       setlist.objectID = objectID
       return setlist
   } catch let error as NSError {
       print("Could not fetch. (error), (error.userInfo)")
   return nil
   }

}

Dieses Beispiel verwendet Core Data, um Instanzen des Structs Setlist zu speichern und abzurufen. Es verwendet NSManagedObjects, um die Entitäten von Setlist und Song im Datenmodell darzustellen und die Beziehungen zwischen ihnen zu verwalten. Bitte beachten Sie, dass es hier nur um ein Beispiel geht und dass Core Data viele weitere Funktionen bietet, die je nach Anwendungsfall sinnvoll sein können.