如何将Array保存到CoreData?

Bar*_*zyk 72 arrays core-data ios magicalrecord swift

我需要将我的数组保存到Core Data.

let array = [8, 17.7, 18, 21, 0, 0, 34]
Run Code Online (Sandbox Code Playgroud)

该数组内的值和值的数量是可变的.

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

}
Run Code Online (Sandbox Code Playgroud)

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?
Run Code Online (Sandbox Code Playgroud)

Bar*_*zyk 147

好的,我做了一些研究和测试.使用Transformable类型,解决方案很简单:

1.我在NSManagedObject类中声明什么?

@NSManaged var values: [NSNumber]  //[Double] also works
Run Code Online (Sandbox Code Playgroud)

2.我在.xcdatamodel中声明了什么?

Transformable 数据类型.

3.如何在我的实体中保存?

statistics!.values = [23, 45, 567.8, 123, 0, 0] //just this
Run Code Online (Sandbox Code Playgroud)

"您可以将NSArray或NSDictionary存储为可转换属性.这将使用NSCoding将数组或字典序列化为NSData属性(并在访问时适当地反序列化)" - 来源

或者如果要将其声明为二进制数据,请阅读以下简单文章:

  • 就我而言,我正在尝试使用字符串数组,但它不起作用 (3认同)
  • 对于一个字符串数组也可以使用`[NSString]` (2认同)
  • 看起来这不适用于 Swift 的未来版本:/sf/ask/4381298981/ (2认同)

Hol*_*dad 71

Swift 3 由于我们在Swift 3中没有实现文件,我们要做的是转到xcdatamodeld文件,选择实体和所需的属性(在本例中,它被称为值).将其设置为可转换及其自定义类[Double].现在将它用作普通数组.

将自定义类设置为Double数组

  • 您始终可以将 codegen 设置为 Manual/None 并编写自己的 Core Data 模型类。 (3认同)
  • 另外,将“NSSecureUnarchiveFromData”设置为“值转换器”(它已重命名为“转换器”)。否则,您可能会收到此运行时警告:“'NSKeyedUnarchiveFromData' 不应用于取消归档,并将在未来版本中删除” (3认同)

Vin*_*dan 13

将Array转换为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)")
}
Run Code Online (Sandbox Code Playgroud)

选择二进制数据

将NSData转换为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)")
}
Run Code Online (Sandbox Code Playgroud)

例如:https://github.com/kkvinokk/Event-Tracker

  • 如果您想向该属性添加谓词,它可能不起作用。 (2认同)

Ale*_*nov 10

如果保持简单并将数组存储为字符串

尝试这个:

// 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!)
Run Code Online (Sandbox Code Playgroud)

分别对于其他数据类型:

// 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!)
Run Code Online (Sandbox Code Playgroud)