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?
NSManagedObject
: ¿@NSManaged var values: [Double]
está bien? ¿Puede decirme qué tipo debo usar.xcdatamodel
para guardar esto?Respuestas:
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?
Transformable
tipo de datos.3. ¿Cómo guardo esto en mi Entidad?
statistics!.values = [23, 45, 567.8, 123, 0, 0] //just this
O si desea declararlo como datos binarios , lea este simple artículo :
fuente
[NSString]
una variedad de cadenasSwift 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 utilícelo como una matriz normal.fuente
Convertir matriz 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 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
fuente
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!)
fuente
Hacer que el tipo de atributo de entidad sea "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.
fuente
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") } }
fuente