Comment save un tableau à CoreData?

Je dois save ma masortingce pour datatables de base.

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. Que dois-je déclarer dans ma class 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. Que dois-je déclarer dans mon .xcdatamodel?

entrez la description de l'image ici

3. Comment puis-je sauvegarder ceci 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 searchs et des tests. En utilisant le type Transformable , la solution est simple:

1. Que dois-je déclarer dans ma class NSManagedObject?

 @NSManaged var values: [NSNumber] //[Double] also works 

2. Que dois-je déclarer dans mon .xcdatamodel?

Type de données Transformable .

3. Comment puis-je sauvegarder 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'atsortingbut transformable. Cela utilisera le NSCoding pour sérialiser le tableau ou le dictionary vers un atsortingbut NSData (et le désérialiser correctement lors de l'access) "- Source

Ou Si vous voulez le déclarer en tant que données binarys, lisez cet article simple :

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

Sélectionnez les données binaires

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! [[Ssortingng: Ssortingng]] Array = arrayObject } } } catch let error as NSError { print("Could not fetch \(error), \(error.userInfo)") } 

Par exemple: https://github.com/kkvinokk/Event-Tracker

Swift 3 Comme nous n'avons plus les files d'implémentation à partir de Swift 3, ce que nous devons faire est d'aller dans le file xcdatamodeld, select l'entité et l'atsortingbut désiré (dans cet exemple, il s'agit de valeurs). Définissez-le comme transformable et sa class personnalisée sur [Double] . Maintenant, utilisez-le comme un tableau normal.

Définition de la classe personnalisée au tableau de Double

Swift 2.3

 import UIKit import CoreData @objc(Merchant_Status) class Merchant_Status: NSManagedObject { @NSManaged var data: [AnyObject] @NSManaged var uniqueKey: Ssortingng } // MARK: - // MARK: - MERCHANT STATUS extension CoreDataHelper{ class func saveMerchantStatus(data :[AnyObject]) { let uniqueKey = MERCHENT_INFO.MERCHANT_ID let context: NSManagedObjectContext = CoreDataHelper.managedObjectContext() let request = NSFetchRequest(entityName: "Merchant_Status") request.predicate = NSPredicate(format: "uniqueKey = %@", uniqueKey) do { let fetchedEntities = try CoreDataHelper.managedObjectContext().executeFetchRequest(request) if fetchedEntities.count != 0{ let managedObject = fetchedEntities[0]as! NSManagedObject managedObject.setValue(data, forKey: CoredataConstant.kDATA) do { try context.save() } catch { print(error) } }else{ let entityDescription = NSEntityDescription.entityForName("Merchant_Status", inManagedObjectContext:CoreDataHelper.managedObjectContext()) let context = NSManagedObject(entity: entityDescription!, insertIntoManagedObjectContext:CoreDataHelper.managedObjectContext()) context.setValue(data, forKey: CoredataConstant.kDATA) context.setValue(uniqueKey, forKey: CoredataConstant.kUNIQUE_KEY) //unique value do { try context.managedObjectContext?.save() } catch { print(error) } } } catch { print(error) } } class func getMerchantStatus() -> [Ssortingng:AnyObject]{ let fetchRequest = NSFetchRequest() let entityDescription = NSEntityDescription.entityForName("Merchant_Status", inManagedObjectContext: CoreDataHelper.managedObjectContext()) fetchRequest.entity = entityDescription var parameters:[Ssortingng:AnyObject] = [Ssortingng: AnyObject]() do { let result = try CoreDataHelper.managedObjectContext().executeFetchRequest(fetchRequest) if (result.count > 0) { let person = result[0] as! NSManagedObject let deposits_Amount:[AnyObject] = person.valueForKey(CoredataConstant.kDATA)! as! [AnyObject] parameters = deposits_Amount[0] as! [Ssortingng:AnyObject] } } catch { let fetchError = error as NSError print(fetchError) } return parameters } } 

entrez la description de l'image ici