将字符串数组保存到CoreData

时间:2019-08-29 05:58:24

标签: arrays swift core-data

我正在尝试将6个字符串组成的数组保存到CoreData,如下所示:

     let imageUrls = ["image-url....", "image-url....", ..., "image-url"]

我尝试了How to save Array to CoreData?Best practice? - Array/Dictionary as a Core Data Entity Attribute中所述的所有方法,但均未成功。

这是我要尝试的方法。

在我的.xcdatamodeld中,我声明了: imageUrl作为可变形图片,请参见链接中的图片(无法将其附加到帖子中,对此感到抱歉!):https://drive.google.com/file/d/1VJey55oD9KhOy1KDy59h8PweMMQnaK2-/view?usp=sharing

在我的NSManagedObject类中

    @objc(Entity)
    public class Entity: NSManagedObject {
    @NSManaged public var imageUrls: [String]?
    ....

这是在将实体保存到CoreData之前创建实体的方式:

    entity.imageUrls = ["test", "test", "test"]

当我尝试获取imageUrls时,获取的entity.imageUrls等于nil。我不明白预期结果与我保存到CoreData的数组相同。

Joakim Danielson的回答

6 个答案:

答案 0 :(得分:3)

检查以下附件中“ .xcdatamodelId”文件中的磁偏角。之后,在CoreDataProperties.swift文件中的

行下面声明
@NSManaged public var thumbnail: [String]?

现在,我们可以将字符串数组初始化为缩略图变量了。Declaration variable in xcdatamodelID file

答案 1 :(得分:1)

我的建议是将数组编码/解码为JSON并使用计算所得的属性。从Swift的角度来看,这可能比transformable属性更有效,该属性将数组桥接到Objective-C运行时并使用更重的NSCoding

@NSManaged public var imageUrls: String

var urls : [String] {
    get {
        let data = Data(imageUrls.utf8)
        return (try? JSONDecoder().decode([String].self, from: data)) ?? []
    }
    set {
        guard let data = try? JSONEncoder().encode(newValue),
            let string = String(data: data, encoding: .utf8) else { imageUrls = "" }
        imageUrls = string
    }
}

另一个好处是可以搜索JSON字符串

答案 2 :(得分:0)

您将必须将其保存为String的核心数据,并使用分隔符拆分数组。问题是您必须确保该字符串不包含该分隔符。

例如,如果在将数组保存到核心数据时使用了分隔符“,”,则必须像

那样保存它
coreData.arrayToStringValue = array.joined(separator: ", ")

,当您读取数据时,您必须像这样读取数据:

let arrayFromStringValue:[String] = coreDataValue.split(separator: ", ")

答案 3 :(得分:0)

如果您的对象无需任何自定义类即可进行转换,则可能要将其强制转换为[NSObject]并像这样保存它,因为它是Transformable基类型。但是您可能应该将其[String]作为基类。

也没有迹象表明您曾经将数据保存到core data吗?您所显示的只是在模型中分配变量。您真的不应该这样做,因为它们应该是immutable,而不是mutable

答案 4 :(得分:0)

将imageUrl的类型更改为BinaryData,然后将列表转换为数据并保存。

let urls = NSKeyedArchiver.archivedData(withRootObject: imageUrls)
manageObject.setValue(urls, forKey: "imageUrls")

答案 5 :(得分:-2)

以下是我们可以存储的数据类型。

enter image description here

您无法存储阵列数据。您需要转换成逗号分隔的字符串。然后尝试将其保存到coredata中。并且在提取时,可以将其转换为array