Je dois sauvegarder mon tableau dans Core Data.
let array = [8, 17.7, 18, 21, 0, 0, 34]
Les valeurs à l'intérieur de ce tableau et le nombre de valeurs sont variables.
1. Qu'est-ce que je déclare dans ma classe NSManagedObject?
class PBOStatistics: NSManagedObject, Equatable {
@NSManaged var date: NSDate
@NSManaged var average: NSNumber
@NSManaged var historicAverage: NSNumber
@NSManaged var total: NSNumber
@NSManaged var historicTotal: NSNumber
@NSManaged var ordersCount: NSNumber
@NSManaged var historicOrdersCount: NSNumber
@NSManaged var values: [Double] //is it ok?
@NSManaged var location: PBOLocation
}
2. Qu'est-ce que je déclare dans mon .xcdatamodel?
3. Comment enregistrer cela dans mon entité? (J'utilise MagicalRecord)
let statistics = (PBOStatistics.MR_createInContext(context) as! PBOStatistics)
statistics.values = [8, 17.7, 18, 21, 0, 0, 34] //is it enough?
Ok, j'ai fait des recherches et des tests. En utilisant le type Transformable, la solution est simple:
1. Qu'est-ce que je déclare dans ma classe NSManagedObject?
@NSManaged var values: [NSNumber] //[Double] also works
2. Qu'est-ce que je déclare dans mon .xcdatamodel?
Transformable
type de données.
3. Comment enregistrer ceci dans mon entité?
statistics!.values = [23, 45, 567.8, 123, 0, 0] //just this
«Vous pouvez stocker un NSArray ou un NSDictionary en tant qu'attribut transformable. Cela utilisera le NSCoding pour sérialiser le tableau ou le dictionnaire en un attribut NSData (et le désérialiser de manière appropriée lors de l'accès) "- Source
Ou si vous voulez le déclarer comme Données binaires, lisez ceci article simple :
Swift 3 Comme nous n'avons plus les fichiers d'implémentation à partir de Swift 3, nous devons aller au fichier xcdatamodeld, sélectionnez l'entité et l'attribut souhaité (dans cet exemple, il s'appelle valeurs). Définissez-le comme transformable et sa classe personnalisée à [Double]
. Maintenant, utilisez-le comme un tableau normal.
Convertir un tableau en NSData
let appDelegate =
UIApplication.sharedApplication().delegate as! AppDelegate
let managedContext = appDelegate.managedObjectContext
let entity = NSEntityDescription.entityForName("Device",
inManagedObjectContext:managedContext)
let device = NSManagedObject(entity: entity!,
insertIntoManagedObjectContext: managedContext)
let data = NSKeyedArchiver.archivedDataWithRootObject(Array)
device.setValue(data, forKey: "dataOfArray")
do {
try managedContext.save()
devices.append(device)
} catch let error as NSError {
print("Could not save \(error), \(error.userInfo)")
}
Convertir NSData en tableau
let appDelegate =
UIApplication.sharedApplication().delegate as! AppDelegate
let managedContext = appDelegate.managedObjectContext
let fetchRequest = NSFetchRequest(entityName: "Device")
do {
let results =
try managedContext.executeFetchRequest(fetchRequest)
if results.count != 0 {
for result in results {
let data = result.valueForKey("dataOfArray") as! NSData
let unarchiveObject = NSKeyedUnarchiver.unarchiveObjectWithData(data)
let arrayObject = unarchiveObject as AnyObject! as! [[String: String]]
Array = arrayObject
}
}
} catch let error as NSError {
print("Could not fetch \(error), \(error.userInfo)")
}
Par exemple: https://github.com/kkvinokk/Event-Tracker
Si rester simple et stocker un tableau sous forme de chaîne
Essaye ça:
// Array of Strings
let array: [String] = ["red", "green", "blue"]
let arrayAsString: String = array.description
let stringAsData = arrayAsString.data(using: String.Encoding.utf16)
let arrayBack: [String] = try! JSONDecoder().decode([String].self, from: stringAsData!)
Pour les autres types de données respectivement:
// Set of Doubles
let set: Set<Double> = [1, 2.0, 3]
let setAsString: String = set.description
let setStringAsData = setAsString.data(using: String.Encoding.utf16)
let setBack: Set<Double> = try! JSONDecoder().decode(Set<Double>.self, from: setStringAsData!)
Le code suivant fonctionne pour moi pour stocker un tableau de JSON dans CoreData
func saveLocation(model: [HomeModel],id: String){
let newUser = NSEntityDescription.insertNewObject(forEntityName: "HomeLocationModel", into: context)
do{
var dictArray = [[String: Any]]()
for i in 0..<model.count{
let dict = model[i].dictionaryRepresentation()
dictArray.append(dict)
}
let data = NSKeyedArchiver.archivedData(withRootObject: dictArray)
newUser.setValue(data, forKey: "locations")
newUser.setValue(id, forKey: "id")
try context.save()
}catch {
print("failure")
}
}
Définir le type d'attribut d'entité en tant que "données binaires"
NSData *arrayData = [NSKeyedArchiver archivedDataWithRootObject:TheArray];
myEntity.arrayProperty = arrayData;
[self saveContext]; //Self if we are in the model class
Retriver tableau d'origine en tant que:
NSMutableArray *array = [NSKeyedUnarchiver unarchiveObjectWithData:anEntity.arrayProperty];
C'est tout.