web-dev-qa-db-fra.com

Comment enregistrer des données locales dans une application Swift?

Je travaille actuellement sur une application iOS développée en Swift et j'ai besoin de stocker sur l'appareil le contenu créé par l'utilisateur, mais je n'arrive pas à trouver un moyen simple et rapide de stocker/recevoir les utilisateurs. contenu sur l'appareil.

Quelqu'un pourrait-il expliquer comment stocker et accéder au stockage local?

L'idée est de stocker les données lorsque l'utilisateur exécute une action et de les recevoir au démarrage de l'application.

127
Nicklas Ridewing

La solution la plus simple si vous ne stockez que deux chaînes est NSUserDefaults. Dans Swift 3, cette classe a été renommée en UserDefaults.

Il est préférable de stocker vos clés quelque part dans le monde afin de pouvoir les réutiliser ailleurs dans votre code.

struct defaultsKeys {
    static let keyOne = "firstStringKey"
    static let keyTwo = "secondStringKey"
}

Swift 3.0, 4.0 et 5.0

// Setting

let defaults = UserDefaults.standard
defaults.set("Some String Value", forKey: defaultsKeys.keyOne)
defaults.set("Another String Value", forKey: defaultsKeys.keyTwo)

// Getting

let defaults = UserDefaults.standard
if let stringOne = defaults.string(forKey: defaultsKeys.keyOne) {
    print(stringOne) // Some String Value
}
if let stringTwo = defaults.string(forKey: defaultsKeys.keyTwo) {
    print(stringTwo) // Another String Value
}

Swift 2.0

// Setting

let defaults = NSUserDefaults.standardUserDefaults()
defaults.setObject("Some String Value", forKey: defaultsKeys.keyOne)
defaults.setObject("Another String Value", forKey: defaultsKeys.keyTwo)

// Getting

let defaults = NSUserDefaults.standardUserDefaults()
if let stringOne = defaults.stringForKey(defaultsKeys.keyOne) {
    print(stringOne) // Some String Value
}
if let stringTwo = defaults.stringForKey(defaultsKeys.keyTwo) {
    print(stringTwo) // Another String Value
}

Pour tout ce qui est plus sérieux que la configuration mineure, les drapeaux ou les chaînes de base, vous devez utiliser une sorte de magasin persistant - Une option populaire pour le moment est Realm mais vous pouvez également utiliser SQLite ou Pommes très propres CoreData .

181
Wez

Ils disent Utiliser NSUserDefaults

Lorsque j'ai implémenté le stockage de données à long terme (après la fermeture de l'application) pour la première fois, tout ce que j'ai lu en ligne m'a dirigé vers NSUserDefaults. Cependant, je voulais stocker un dictionnaire et, bien que possible, cela s’avérait être une douleur. J'ai passé des heures à essayer de faire disparaître les fautes de frappe.

NSUserDefaults est également limité dans la fonction

Des lectures supplémentaires ont révélé comment la lecture/écriture de NSUserDefaults force réellement l'application à lire/écrire tout ou rien, tout à la fois, de sorte qu'elle n'est pas efficace. Ensuite, j'ai appris que la récupération d'un tableau n'est pas simple. J'ai réalisé que si vous stockez plus que quelques chaînes ou booléens, NSUserDefaults n'est vraiment pas idéal.

Ce n'est pas non plus évolutif. Si vous apprenez à coder, apprenez de manière évolutive. Utilisez uniquement NSUserDefaults pour stocker des chaînes simples ou des booléens liés aux préférences. Stockez des matrices et d’autres données avec Core Data, ce n’est pas aussi difficile qu’ils le disent. Commencez petit.

Mise à jour: De plus, si vous ajoutez Apple Watch Support, il existe un autre facteur à considérer. Le NSUserDefaults de votre application est maintenant automatiquement envoyé à Watch Watch.

Utilisation des données de base

J'ai donc ignoré les avertissements selon lesquels Core Data est une solution plus difficile et j'ai commencé à lire. Dans les trois heures, je le faisais fonctionner. J'ai eu mon tableau de table en cours d'enregistrement dans Core Data et recharger les données lors de la sauvegarde de l'application! Le code du didacticiel était assez facile à adapter et j’ai pu le faire stocker à la fois des tableaux de titres et de détails avec un peu plus d’expérimentation.

Par conséquent, si vous lisez ce billet et que vous rencontrez des problèmes de type NSUserDefault ou dont le besoin dépasse le simple stockage de chaînes, envisagez de passer une heure ou deux à jouer avec des données de base.

Voici le tutoriel que j'ai lu:

http://www.raywenderlich.com/85578/first-core-data-app-using-Swift

Si vous n'avez pas coché "Données de base"

Si vous n'avez pas coché "Core Data" lors de la création de votre application, vous pouvez l'ajouter après et cela ne prend que cinq minutes:

http://craig24.com/2014/12/how-to-add-core-data-to-an-existing-Swift-project-in-xcode/

http://blog.zeityer.com/post/119012600864/adding-core-data-to-an-existing-Swift-project

Comment supprimer des listes de données de base

Supprimer les données de Coredata Swift

50
Dave G

Okey alors merci à @ bploat et au lien vers http://www.codingexplorer.com/nsuserdefaults-a-Swift-introduction/

J'ai trouvé que la réponse est assez simple pour un stockage de chaîne de base.

let defaults = NSUserDefaults.standardUserDefaults()

// Store
defaults.setObject("theGreatestName", forKey: "username")

// Receive
if let name = defaults.stringForKey("username")
{
    print(name)
    // Will output "theGreatestName"
}

Je l'ai résumé ici http://ridewing.se/blog/save-local-data-in-Swift/

11
Nicklas Ridewing

L'utilisation de NSCoding and NSKeyedArchiver est une autre excellente option pour les données trop complexes pour NSUserDefaults, mais pour lesquelles CoreData serait excessif. Cela vous donne également la possibilité de gérer la structure de fichiers de manière plus explicite, ce qui est très bien si vous souhaitez utiliser le cryptage.

8
Patrick Lynch

Pour Swift 4.0, cela est devenu plus facile:

let defaults = UserDefaults.standard
//Set
defaults.set(passwordTextField.text, forKey: "Password")
//Get
let myPassword = defaults.string(forKey: "Password")
7

Swift 3.

Setter: Local Storage

let authtoken = "12345"
    // Userdefaults helps to store session data locally 
 let defaults = UserDefaults.standard                                           
defaults.set(authtoken, forKey: "authtoken")

 defaults.synchronize()

Getter: Stockage local

 if UserDefaults.standard.string(forKey: "authtoken") != nil {

//perform your task on success }
6
Ravindra Shekhawat

Pour Swift 3

UserDefaults.standard.setValue(token, forKey: "user_auth_token")
print("\(UserDefaults.standard.value(forKey: "user_auth_token")!)")
5
Arun Yokesh

Pour quelqu'un qui ne préfère pas gérer UserDefaults pour certaines raisons, il existe une autre option - NSKeyedArchiver & NSKeyedUnarchiver. Il permet d’enregistrer des objets dans un fichier à l’aide d’Archiver et de charger le fichier archivé dans les objets d’origine.

// To archive object,
let mutableData: NSMutableData = NSMutableData()
let archiver: NSKeyedArchiver = NSKeyedArchiver(forWritingWith: mutableData)
archiver.encode(object, forKey: key)
archiver.finishEncoding()
return mutableData.write(toFile: path, atomically: true)

// To unarchive objects,
if let data = try? Data(contentsOf: URL(fileURLWithPath: path)) {
    let unarchiver = NSKeyedUnarchiver(forReadingWith: data)
    let object = unarchiver.decodeObject(forKey: key)
}

J'ai écrit un utilitaire simple pour enregistrer/charger des objets dans un stockage local. J'ai utilisé les exemples de codes ci-dessus. Vous voudrez peut-être voir ceci. https://github.com/DragonCherry/LocalStorage

4
DragonCherry