ios arrays swift core-data magicalrecord

ios - ¿Cómo guardar Array en CoreData?



arrays swift (6)

Convertir matriz a 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 a matriz

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

Por ejemplo: https://github.com/kkvinokk/Event-Tracker

Necesito guardar mi matriz en Core Data.

let array = [8, 17.7, 18, 21, 0, 0, 34]

Los valores dentro de esa matriz y el número de valores son variables.

1. ¿Qué declaro dentro de mi clase 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é declaro dentro de mi .xcdatamodel?

3. ¿Cómo guardo esto en mi entidad? (Yo uso MagicalRecord)

let statistics = (PBOStatistics.MR_createInContext(context) as! PBOStatistics) statistics.values = [8, 17.7, 18, 21, 0, 0, 34] //is it enough?


El siguiente código me funciona para almacenar una matriz de JSON en 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") } }


Hacer el tipo de atributo de entidad como "Datos binarios"

NSData *arrayData = [NSKeyedArchiver archivedDataWithRootObject:TheArray]; myEntity.arrayProperty = arrayData; [self saveContext]; //Self if we are in the model class

Recuperar matriz original como:

NSMutableArray *array = [NSKeyedUnarchiver unarchiveObjectWithData:anEntity.arrayProperty];

Eso es todo.


Ok, hice algunas investigaciones y pruebas. Usando el tipo transformable , la solución es simple:

1. ¿Qué declaro dentro de mi clase NSManagedObject?

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

2. ¿Qué declaro dentro de mi .xcdatamodel?

Tipo de datos Transformable .

3. ¿Cómo guardo esto en mi entidad?

statistics!.values = [23, 45, 567.8, 123, 0, 0] //just this

“Puede almacenar un NSArray o un NSDictionary como un atributo transformable. Esto usará NSCoding para serializar la matriz o el diccionario a un atributo NSData (y deserializarlo adecuadamente al acceder) "- Source

O bien, si desea declararlo como datos binarios , lea este simple artículo :


Si lo mantiene simple y almacena una matriz como una cadena

Prueba esto:

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

Para otros tipos de datos respectivamente:

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


Swift 3 Como ya no tenemos los archivos de implementación a partir de Swift 3, lo que tenemos que hacer es ir al archivo xcdatamodeld, seleccionar la entidad y el atributo deseado (en este ejemplo se llama valores). Configúrelo como transformable y su clase personalizada en [Double] . Ahora úselo como una matriz normal.