web-dev-qa-db-fra.com

Comment sauvegarder Array dans CoreData?

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?

enter image description here

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?
62

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 :

127

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.

 Setting custom class to array of Double

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)")
}

 Select Binary Data

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

11
Vinoth Anandan

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!)
2
Alexey Chekanov

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")
    }

}
0
Rahul Gusain

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.

0
Avijit Nagare