2015-04-23 13 views
42

Devo salvare il mio array su Core Data.Come salvare Array su CoreData?

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

I valori all'interno di tale array e il numero di valori sono variabili.

1. Che cosa dichiaro all'interno della mia 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. Cosa dichiaro dentro il mio .xcdatamodel?

enter image description here

3. Come si salvano nel mio Entity? (io uso MagicalRecord)

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

Non c'è nessun "dovrebbe", il progetto DB sta a voi, per esempio per quanto mi riguarda, potresti anche usare le date o il formato di testo se questo è il modo più efficace per archiviare questi dati nella tua applicazione. –

+0

Quindi dentro il mio 'NSManagedObject':' @NSGestoli var varati: [Double] 'è buono? Puoi dirmi che tipo dovrei usare in '.xcdatamodel' per salvare questo? –

+0

Potrei non averlo chiarito abbastanza, il modo in cui lo chiedi riguarda le preferenze personali, non c'è un vero problema da risolvere. Se stai cercando un modo per utilizzare le relazioni uno-a-molti, aggiungi le informazioni di ciò che hai provato e in cui hai riscontrato un problema. Se comprendi ciascuna delle soluzioni menzionate da te e cerchi quella più efficiente, elenca i criteri di efficienza e descrivi i casi d'uso. Se per qualche motivo hai problemi a comprendere diversi tipi di relazioni o non vuoi affatto usare le relazioni, dillo direttamente. –

risposta

98

Ok, ho fatto qualche ricerca e sperimentazione. Utilizzo del tipo Trasformabile, la soluzione è semplice:

1. Che cosa dichiaro all'interno della classe NSManagedObject?

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

2. Cosa dichiaro dentro il mio .xcdatamodel?

Transformable tipo di dati.

3. Come si salva questo nella mia Entità?

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

“è possibile memorizzare un NSArray o un NSDictionary come un attributo trasformabile. Questo utilizzerà il NSCoding per serializzare la matrice o un dizionario ad un attributo NSData (e opportunamente deserializzare su di accesso)”- Source

o se si vuole di dichiararla come dati binari allora leggete questo simple article:

+0

Buon lavoro, la risposta sembra valere un segno di spunta verde per il completamento. –

+0

Funziona anche con '[NSString]' per una serie di stringhe –

+0

È possibile aggiungere un predicato durante il recupero dai dati principali? – Satyam

7

Convert Array per 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)") 
} 

Select Binary Data

Convert NSData di Array

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

Per esempio: https://github.com/kkvinokk/Event-Tracker

+1

L'utilizzo di NSData è davvero più sensato e più semplice. – GeneCode

+0

Se si desidera aggiungere un predicato a quell'attributo, potrebbe non funzionare. – Satyam

19

Swift 3 Come non abbiamo più i file di implementazione come di Swift 3, quello che dobbiamo fare è andare al xcdatamodeld file, selezionare l'entità e l'attributo desiderato (in questo esempio è chiamato valori). Impostarlo come trasformabile e la sua classe personalizzata su [Double]. Ora usalo come un normale array.

Setting custom class to array of Double

+0

È possibile definire una classe personalizzata come [[String: Any]]? Una serie di dizionari – BergP

+0

In teoria dovrebbe essere accettabile, tuttavia non ho mai provato. –