Que necesito para salvar mi matriz de Datos Básicos.

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

Los valores dentro de la matriz, y el número de valores de la variable.

1. ¿Qué debo declarar dentro de mi NSManagedObject clase?

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é debo declarar dentro de mi .xcdatamodel?

Cómo guardar la Matriz de CoreData?

3. ¿Cómo puedo guardar 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?
  • No hay un «debe», la base de datos del diseño, por ejemplo en cuanto a mí se refiere usted podría utilizar fechas o en formato de texto si esto resulta ser la forma más eficiente de almacenar estos datos en su aplicación.
  • Así que dentro de mi NSManagedObject: @NSManaged var values: [Double] es buena? Me puedes decir qué tipo se debe utilizar en .xcdatamodel a guardar esto?
  • Es posible que yo no he hecho es lo suficientemente clara, la forma de preguntar es acerca de la preferencia personal, no hay ningún problema real a resolver. Si usted está buscando alguna forma de usar uno-a-muchos de relaciones, agregar la información de lo que has probado y donde he tenido un problema. Si usted entiende cada una de las soluciones mencionadas por usted y está buscando el más eficiente una lista de los criterios de eficiencia y describir los casos de uso. Si por alguna razón usted está teniendo problemas en la comprensión de diferentes tipos de relaciones o no desea utilizar las relaciones a todos – dicen directamente.
  • He actualizado a la pregunta
  • Ahora que es un decente pregunta, he añadido un MagicalRecord etiqueta para usted, por desgracia, no tengo experiencia en esta área y esperemos que alguien que será capaz de ayudarle mejor a partir de este punto.

6 Comentarios

  1. 135

    Ok, he hecho algunas investigaciones y pruebas. El uso de Transformables tipo, la solución es simple:

    1. ¿Qué debo declarar dentro de mi NSManagedObject clase?

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

    2. ¿Qué debo declarar dentro de mi .xcdatamodel?

    Transformable tipo de datos.

    3. ¿Cómo puedo guardar esto en mi Entidad?

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

    «Puede almacenar un NSArray o un NSDictionary como transformables atributo. Esto va a utilizar el NSCoding para serializar la matriz o un diccionario a un NSData atributo (y adecuadamente deserializar sobre acceso)» – Fuente

    O Si desea declarar como Datos Binarios luego de leer este artículo sencillo:

    • Buen trabajo, la respuesta parece ser que vale la pena una marca de verificación verde para la finalización de la causa.
    • También funciona con [NSString] para una matriz de cadenas
    • Es posible añadir predicado, mientras que la captura de los datos de los núcleos?
    • En mi caso estoy tratando de utilizar un array de Cadenas de caracteres y no funciona
    • ¿cómo se puede hacer esto en swift de 3 vías?
  2. 63

    Swift 3
    Como no tenemos los archivos de implementación, ya que de Swift 3, lo que tenemos que hacer es ir a la xcdatamodeld archivo, seleccione la entidad y el atributo deseado (en este ejemplo se llama valores).
    Se establece como transformables y su clase personalizada para [Double]. Ahora lo uso como una matriz normal.

    Cómo guardar la Matriz de CoreData?

    • Es posible definir una clase personalizada como [[String: Cualquier]] ? Una matriz de diccionarios
    • Teóricamente debería ser aceptable, sin embargo yo nunca lo he probado.
  3. 12

    Convertir la Matriz de 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)")
    }

    Cómo guardar la Matriz de CoreData?

    Convertir NSData a la 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

    • El uso de NSData, de hecho, tiene más sentido y más simple.
    • Si desea agregar un predicado a ese atributo, puede que no funcione.
  4. 2

    Si mantenerlo simple y almacenar una matriz como una cadena

    Intente 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!)
    • Su solución guardado mi tiempo mucho
    • No estoy seguro de por qué, pero ninguna de estas soluciones están trabajando para mí. He intentado la solución de almacenamiento de los datos de la matriz de cadena en los Datos Básicos y la recuperación, luego de la decodificación a una matriz de cadena después, pero aún no funciona. Algún consejo?
    • Podría dar algún código?
  5. 1

    Hacer entidad tipo de atributo como «Datos Binarios»

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

    Recupero de la matriz original como:

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

    Eso es todo.

  6. 0

    Siguiente código me funciona para almacenar la 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")
        }
    
    }

Dejar respuesta

Please enter your comment!
Please enter your name here