ios - vers - Comment sauvegarder Array dans CoreData?




transferer notes ipad vers iphone (4)

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

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


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.


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?

Type de données Transformable .

3. Comment sauvegarder cela 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 en tant que données binaires, lisez cet article simple :


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!)






magicalrecord