Muszę zapisać moją tablicę w danych podstawowych.
let array = [8, 17.7, 18, 21, 0, 0, 34]
Wartości wewnątrz tej tablicy i liczba wartości są zmienne.
1. Co deklaruję w mojej klasie 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. Co mam zadeklarować w moim .xcdatamodel?
3. Jak mogę to zapisać w mojej jednostce? (Używam 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]
czy to dobrze? Czy możesz mi powiedzieć, jakiego typu mam użyć,.xcdatamodel
aby to zapisać?Odpowiedzi:
Ok, przeprowadziłem badania i testy. Korzystanie Transformable typ, rozwiązanie jest proste:
1. Co deklaruję w mojej klasie NSManagedObject?
@NSManaged var values: [NSNumber] //[Double] also works
2. Co mam zadeklarować w moim .xcdatamodel?
Transformable
typ danych.3. Jak mogę to zapisać w mojej jednostce?
statistics!.values = [23, 45, 567.8, 123, 0, 0] //just this
Lub jeśli chcesz zadeklarować je jako dane binarne, przeczytaj ten prosty artykuł :
źródło
[NSString]
tablicą smyczkowąSwift 3 Ponieważ od wersji Swift 3 nie mamy już plików implementacji, musimy przejść do pliku xcdatamodeld, wybrać jednostkę i żądany atrybut (w tym przykładzie nazywa się to wartościami). Ustaw go jako transformowalny, a jego klasę niestandardową na
[Double]
. Teraz użyj go jako zwykłej tablicy.źródło
Konwertuj Array na 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)") }
Konwertuj NSData na 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)") }
Na przykład: https://github.com/kkvinokk/Event-Tracker
źródło
Jeśli zachowasz prostotę i zapisz tablicę jako ciąg
Spróbuj tego:
// 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!)
W przypadku innych typów danych odpowiednio:
// 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!)
źródło
Ustaw typ atrybutu encji na „Dane binarne”
NSData *arrayData = [NSKeyedArchiver archivedDataWithRootObject:TheArray]; myEntity.arrayProperty = arrayData; [self saveContext]; //Self if we are in the model class
Przywróć oryginalną macierz jako:
NSMutableArray *array = [NSKeyedUnarchiver unarchiveObjectWithData:anEntity.arrayProperty];
To wszystko.
źródło
Poniższy kod działa dla mnie do przechowywania tablicy JSON w 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") } }
źródło