Saya perlu menyimpan array saya ke Core Data.
let array = [8, 17.7, 18, 21, 0, 0, 34]
Nilai-nilai di dalam larik itu, dan jumlah nilainya adalah variabel.
1. Apa yang saya nyatakan di dalam kelas NSManagedObject saya?
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. Apa yang saya nyatakan di dalam .xcdatamodel saya?
3. Bagaimana cara menyimpan ini di Entitas saya? (Saya menggunakan 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]
apakah itu baik? Bisakah Anda memberi tahu saya jenis apa yang harus saya gunakan.xcdatamodel
untuk menyimpan ini?Jawaban:
Ok, saya melakukan penelitian dan pengujian. Menggunakan tipe Transformable , solusinya sederhana:
1. Apa yang saya nyatakan di dalam kelas NSManagedObject saya?
@NSManaged var values: [NSNumber] //[Double] also works
2. Apa yang saya nyatakan di dalam .xcdatamodel saya?
Transformable
tipe data.3. Bagaimana cara menyimpan ini di Entitas saya?
statistics!.values = [23, 45, 567.8, 123, 0, 0] //just this
Atau Jika Anda ingin mendeklarasikannya sebagai Data Biner, baca artikel sederhana ini :
sumber
[NSString]
untuk array stringSwift 3 Karena kami tidak lagi memiliki file implementasi seperti pada Swift 3, yang harus kami lakukan adalah membuka file xcdatamodeld, pilih entitas dan atribut yang diinginkan (dalam contoh ini disebut nilai). Setel sebagai dapat diubah dan kelas khususnya menjadi
[Double]
. Sekarang gunakan sebagai array normal.sumber
Ubah Array ke 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)") }
Ubah NSData ke 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)") }
Sebagai Contoh: https://github.com/kkvinokk/Event-Tracker
sumber
Jika menjaganya tetap sederhana dan menyimpan array sebagai string
Coba ini:
// 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!)
Untuk tipe data lainnya masing-masing:
// 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!)
sumber
Jadikan jenis atribut entitas sebagai "Data Biner"
NSData *arrayData = [NSKeyedArchiver archivedDataWithRootObject:TheArray]; myEntity.arrayProperty = arrayData; [self saveContext]; //Self if we are in the model class
Dapatkan kembali larik asli sebagai:
NSMutableArray *array = [NSKeyedUnarchiver unarchiveObjectWithData:anEntity.arrayProperty];
Itu saja.
sumber
Kode berikut berfungsi bagi saya untuk menyimpan array JSON di 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") } }
sumber