Мне нужно сохранить свой массив в Core Data.
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. Как мне сохранить это в моем Entity? (Я использую 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]
это хорошо? Можете ли вы сказать мне, какой тип я должен использовать,.xcdatamodel
чтобы сохранить это?Ответы:
Хорошо, я провел небольшое исследование и тестирование. Используя трансформируемый тип, решение просто:
1. Что я объявляю внутри моего класса NSManagedObject?
@NSManaged var values: [NSNumber] //[Double] also works
2. Что я объявляю в моей .xcdatamodel?
Transformable
тип данных.3. Как мне сохранить это в моем Entity?
statistics!.values = [23, 45, 567.8, 123, 0, 0] //just this
Или, если вы хотите объявить его как двоичные данные, прочтите эту простую статью :
источник
[NSString]
массивом строкSwift 3 Поскольку в Swift 3 у нас больше нет файлов реализации, нам нужно перейти к файлу xcdatamodeld, выбрать сущность и желаемый атрибут (в этом примере он называется значениями). Установите его как трансформируемый, а его собственный класс -
[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)") }
Например: 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];
Вот и все.
источник
Следующий код работает для меня для хранения массива JSON в 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") } }
источник