Kerngegevens versus NSKeyedArchiver versus standaardinstellingen gebruiker

Kerngegevens, NSKeyedArchiver en UserDefaults zijn drie manieren waarop een programmeur gegevens kan bewaren tussen de lanceringen van apps. Hoewel kerngegevens iets gecompliceerder zijn, is het handig wanneer de opgeslagen informatie structuur vereist. NSKeyedArchiver is minder complex en langzamer dan kerngegevens, maar is veel eenvoudiger te gebruiken. UserDefaults is de eenvoudigste methode om gegevens te bewaren.

Kerngegevens

De belangrijkste voordelen van kerngegevens zijn:

  1. mogelijkheid om efficiënt te zoeken
  2. gegevens zijn zodanig gestructureerd dat elke entiteit bepaalde attributen heeft (denk aan eigenschappen met specifieke types) en al dan niet door relaties kan worden gerelateerd aan andere entiteiten
  3. automatische migraties - dit betekent in feite alleen dat wanneer u een kerngegevensmodel maakt, er een SQLite-database wordt gemaakt. Als u vervolgens het gegevensmodel wijzigt (bijv. Meer attributen aan het gegevensmodel toevoegt), is het nieuwe gegevensmodel niet compatibel met de oorspronkelijke permanente opslag. Apple verzorgt deze "migratie" van de ene datamodelversie naar de andere voor ons - bedankt Apple !!

Voordat we ingaan op de code, laten we eerst enkele definities doornemen:

  1. De NSPersistentContainer is verantwoordelijk voor het lezen / schrijven naar kerngegevens.
  2. viewContext van het type NSManagedObjectContext. U maakt een exemplaar van een kerngegevensobject via de NSManagedObjectContext.

Om kerngegevens in uw project te integreren, moet u eerst een .xcdatamodel-bestand met kerngegevens maken. In dit bestand definieert u de entiteiten, inclusief de attributen van elke entiteit, die u wenst te behouden. Nadat u het .xcdatamodel-bestand hebt gemaakt, voegt u een nieuw .swift-bestand toe aan het project waarin alle ketelplaatcode voor codegegevens wordt opgenomen. Drie dingen om op te merken in de onderstaande code -

  1. de naam NSPeristentContainer MOET hetzelfde zijn als het .xcdatamodel-bestand.
  2. Ik heb een singleton gemaakt zodat gedurende de hele app slechts één exemplaar van de informatie wordt opgeslagen via kerngegevens. Als je nieuwsgierig bent naar singletons / ontwerppatronen in het algemeen, bekijk dan deze blog.
  3. Vergeet niet CoreData in het .swift-bestand te importeren!

* Als u een nieuw project maakt en ervoor kiest om kerngegevens aan het project toe te voegen, wordt de bovenstaande ketelplaatcode weergegeven in de App Delegate.

Naast het opslaan van gegevens, is de kans groot dat u die gegevens ook wilt ophalen om uw app te vullen de volgende keer dat de app wordt gestart. Stel dat u een entiteit hebt gemaakt in het .xcdatamodel-bestand met de naam 'Boek'. Zoals u in de onderstaande code kunt zien, haalt u gegevens op met NSFetchRequest. Ik heb een array gemaakt, 'Books' genaamd, die gelijk is aan [Book] (), wat een array van de entiteit Book betekent. Wanneer ik mijn app met deze opgeslagen gegevens wil vullen, roep ik deze CoreDataModel.sharedInstance.fetchWorkoutData () func aan en stel de gegevens waarmee ik wil werken gelijk aan CoreDataModel.sharedInstance.books.

Het verwijderen van informatie uit kerngegevens is ook heel eenvoudig - het enige wat u hoeft te doen is de opgeslagen informatie ophalen en de array herhalen en elk object uit de permanente container verwijderen. Voila!

Ik ben niet ingegaan op relaties in dit bericht, maar de volgende blog duikt in het schrijven van de code voor relaties in kerngegevens.

NSKeyedArchiver

NSKeyedArchiver biedt de mogelijkheid om rechtstreeks met schijf te werken. In het bijzonder serialiseert het NSCoding, een protocol met twee methoden:

  1. coderen (met aCoder: NSCoder)
  2. init? (coder aDecoder: NSCoder)

In het onderstaande voorbeeld is mijn doel om een ​​reeks van [Persoon] te handhaven. Class Person heeft twee eigenschappen: firstName (van het type String) en lastName (van het type String). Zoals u kunt zien in de onderstaande code, keurt class Person het NSCoding-protocol goed.

Het opslaan en ophalen van gegevens via NSKeyedArchiver is heel eenvoudig. Als u informatie wilt opslaan, kunt u gewoon een beroep doen op NSKeyedArchiver.archiveRootObject - dit is een ingebouwde methode.

Op dezelfde manier kunt u, wanneer u persistente gegevens wilt ophalen, een andere ingebouwde functie gebruiken, NSKeyedUnarchiver.unarchiveObject.

Zoals u kunt zien, is NSKeyedArchiver veel eenvoudiger te implementeren dan Core Data en is het een aantrekkelijke optie om gegevens te bewaren.

Standaardwaarden gebruiker

UserDefaults is een klasse waarmee verschillende gegevenstypen eenvoudig kunnen worden opgeslagen. Het wordt voornamelijk gebruikt om kleine hoeveelheden gegevens op te slaan om te blijven staan ​​tussen het starten van de app of het opnieuw opstarten van het apparaat. UserDefaults kunnen basistypes (bool, float, double, int, enz.) En meer complexe typen (array, woordenboek) opslaan. Hoewel UserDefaults geen structuur heeft, wordt gezegd dat het sneller is dan kerngegevens, omdat het alleen sleutelwaardeparen zijn. Omdat het geen structuur heeft, is het handig om gegevens op te slaan die geen structuur vereisen - vandaar gebruikersvoorkeuren.

Een ding om op te merken is dat als u een sleutel reset, de opgeslagen gegevens worden vervangen. Beide toetsen MOETEN DEZELFDE ZIJN - als één sleutel alle kleine letters heeft en de tweede sleutel één hoofdletter, worden de bestaande gegevens niet vervangen.

Bedankt voor het lezen en gelukkige codering !!

Referenties:

https://www.hackingwithswift.com/example-code/system/how-to-save-user-settings-using-userdefaults