Как сохранить массив в CoreData?



мне нужно сохранить мой массив в основные данные.



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


значения внутри массива, и количество значений переменной.



1. Что я объявляю внутри моего класса 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. Что я заявляю внутри моего .xcdatamodel?



enter image description here



3. Как сохранить это в моей сущности? (Я использую MagicalRecord)



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

5 ответов:

Ок, я сделал некоторые исследования и испытания. Используя трансформер тип, решение простое:

1. Что я объявляю внутри моего класса NSManagedObject?

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

2. Что я заявляю внутри моего .xcdatamodel?

Transformable тип данных.

3. Как сохранить это в моей сущности?

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

" вы можете хранить NSArray или NSDictionary как трансформируемый атрибут. Это будет использовать NSCoding для сериализации массива или словаря в атрибут NSData (и соответствующим образом десериализовать его при доступе)" -источник

или если вы хотите объявить его как Двоичные Данные тогда прочтите это простой статьи:

Swift 3 Поскольку у нас больше нет файлов реализации по состоянию на Swift 3, нам нужно перейти к файлу xcdatamodeld, выбрать сущность и нужный атрибут (в этом примере он называется values). Установите его как трансформируемый и его пользовательский класс в [Double]. Теперь используйте его как обычный массив.

Setting custom class to array of Double

преобразовать массив в 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

преобразование NSData в массив

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

например:https://github.com/kkvinokk/Event-Tracker

если держать его простым и хранить массив в виде строки

попробуйте это:

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

для других типов данных, соответственно:

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

сделать атрибут сущности типа "двоичные данные"

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

повторите исходный массив как:

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

вот и все.

Comments

    Ничего не найдено.