Как сохранить массив в 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?

3. Как сохранить это в моей сущности? (Я использую MagicalRecord)
let statistics = (PBOStatistics.MR_createInContext(context) as! PBOStatistics)
statistics.values = [8, 17.7, 18, 21, 0, 0, 34] //is it enough?
5 ответов:
Ок, я сделал некоторые исследования и испытания. Используя трансформер тип, решение простое:
1. Что я объявляю внутри моего класса NSManagedObject?
@NSManaged var values: [NSNumber] //[Double] also works2. Что я заявляю внутри моего .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]. Теперь используйте его как обычный массив.
преобразовать массив в 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)") }преобразование 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)") }
если держать его простым и хранить массив в виде строки
попробуйте это:
// 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