Stockage persistant simple dans Swift
J'ai un tableau d'objets, chacun avec un certain nombre de propriétés. Voici quelques exemples de données prises en boucle par le choix des objets:
Name = Rent
Default Value 750
This Months Estimate = 750
Sum Of This Months Actuals = 0
Risk Factor = 0.0
Monthly Average = 750.0
--------------
Name = Bills
Default Value 250
This Months Estimate = 170
Sum Of This Months Actuals = 140
Risk Factor = 0.0
Monthly Average = 190.0
--------------
Name = Food
Default Value 240
This Months Estimate = 200
Sum Of This Months Actuals = 95
Risk Factor = 0.0
Monthly Average = 190.0
--------------
Name = Lunches
Default Value 100
This Months Estimate = 150
Sum Of This Months Actuals = 155
Risk Factor = 0.899999976158142
Monthly Average = 190.0
Son de très peu de données donc je veux éviter d'utiliser la base de données. J'ai besoin d'être capable de persister enregistrer le tableau puis l'ouvrir à nouveau et être en mesure de boucle à travers elle. J'espérais simplement utiliser une solution comme NSUserDefaults ou NSKeyedArchiver mais dans Swift je peux obtenir ni de travailler avec ce type de tableau (j'ai été en passant par la documentation et les forums et les exemples en ligne pour 24 heures maintenant...)
Comment recommanderiez-vous je persiste enregistrer un tableau d'objets comme ci-dessus? OU peut-être persister l'enregistrement de ce type de tableau est une mauvaise pratique?
Merci d'avance pour votre aide!
Ajout de la classe de l'objet:
class costCategory : NSObject {
var name : String
var defaultValue : Int
var thisMonthsEstimate : Int
var sumOfThisMonthsActuals : Int
var riskFactor : Float
var monthlyAverage : Float
init (name:String, defaultValue:Int, thisMonthsEstimate:Int, sumOfThisMonthsActuals:Int, riskFactor:Float, monthlyAverage:Float) {
self.name = name
self.defaultValue = defaultValue
self.thisMonthsEstimate = thisMonthsEstimate
self.sumOfThisMonthsActuals = sumOfThisMonthsActuals
self.riskFactor = riskFactor
self.monthlyAverage = monthlyAverage
}
}
Si j'essaie d'enregistrer le tableau de NSUserDefaults j'obtiens le message d'erreur:
Property list invalid for format: 200 (property lists cannot contain objects of type 'CFType')
J'ai essayé d'utiliser l'héritage de l'NSCoder classe mais j'obtiens une erreur dont je ne suis pas en mesure de résoudre, comme ci-dessous:
class costCategory : NSObject, NSCoder {
var name : String
var defaultValue : Int
var thisMonthsEstimate : Int
var sumOfThisMonthsActuals : Int
var riskFactor : Float
var monthlyAverage : Float
init (name:String, defaultValue:Int, thisMonthsEstimate:Int, sumOfThisMonthsActuals:Int, riskFactor:Float, monthlyAverage:Float) {
self.name = name
self.defaultValue = defaultValue
self.thisMonthsEstimate = thisMonthsEstimate
self.sumOfThisMonthsActuals = sumOfThisMonthsActuals
self.riskFactor = riskFactor
self.monthlyAverage = monthlyAverage
}
//MARK: NSCoding
required convenience init(coder decoder: NSCoder) {
self.init() //Error here "missing argument for parameter name in call
self.name = decoder.decodeObjectForKey("name") as String
self.defaultValue = decoder.decodeIntegerForKey("defaultValue")
self.thisMonthsEstimate = decoder.decodeIntegerForKey("thisMonthsEstimate")
self.sumOfThisMonthsActuals = decoder.decodeIntegerForKey("sumOfThisMonthsActuals")
self.riskFactor = decoder.decodeFloatForKey("riskFactor")
self.monthlyAverage = decoder.decodeFloatForKey("monthlyAverage")
}
func encodeWithCoder(coder: NSCoder) {
coder.encodeObject(self.name, forKey: "name")
coder.encodeInt(Int32(self.defaultValue), forKey: "defaultValue")
coder.encodeInt(Int32(self.thisMonthsEstimate), forKey: "thisMonthsEstimate")
coder.encodeInt(Int32(self.sumOfThisMonthsActuals), forKey: "sumOfThisMonthsActuals")
coder.encodeFloat(self.riskFactor, forKey: "riskFactor")
coder.encodeFloat(self.monthlyAverage, forKey: "monthlyAverage")
}
}
source d'informationauteur user3535074
Vous devez vous connecter pour publier un commentaire.
Il est possible de convertir votre les propriétés de l'objet:les valeurs de chaîne:magasin d'objets à
NSUserDefaults
puis les obtenir et de les décoder en arrière.Si vous souhaitez stocker votre objet à l'aide de
NSKeyedArchiver
votre classe doit être conforme auxNSCoding
et être sous-classe deNSObject
. Exemple:Ensuite, vous pouvez archiver et sauvegarder des
NSDefaults
:De base de Données est incroyablement puissant et je vous recommande fortement d'essayer de ne pas se laisser influencer par son environnement intimidant apparence. Lorsque votre application grandit, vous serez très heureux que vous sauvegardé vos données avec la Base de Données à mesure qu'elle évolue très bien.
Cela étant dit, il y a un bel article sur NSHipster qui couvre les bases de l'utilisation de la NSKeyedArchiver. Donc la solution serait d'avoir vos objets d'une sous-classe de NSObject et conforme à la NSCoding protocole. Cela vous permet d'archiver un désarchiver les objets à partir du disque. Vous pouvez l'enregistrer votre fichier dans le répertoire documents de l'
Votre sous-classe devra alors implicitement déballer tous les encoder-mesure des variables, le résultat serait rendement:
Vous pouvez alors ajouter un moyen de trouver l'emplacement du répertoire documents:
Afin d'archivage devrait ressembler à ceci:
et, plus tard, vous avez pu lire votre tableau à partir du disque:
Je déconseille l'utilisation de valeurs par Défaut pour stocker un tableau, sa destinée à stocker les préférences, de là, prendre un coup d'oeil à la documentation:
Idéalement, vous ne voulez pas persister tableaux parce que vous avez à récupérer l'intégralité de tableau dans la mémoire même si vous avez besoin d'un objet. Naturellement Base de Données permettra de résoudre tous les inutiles tas mess pour vous:)
MODIFIER
À l'aise vous-même dans la Base de Données, vous pouvez toujours regarder Magique Record. Ils simplifient beaucoup les trucs nécessaires pour maintenir la Base de Données de la pile.
Bonne Chance
De Base De Données Évangéliste