我正在尝试将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的回答
答案 0 :(得分:3)
检查以下附件中“ .xcdatamodelId”文件中的磁偏角。之后,在CoreDataProperties.swift文件中的
行下面声明@NSManaged public var thumbnail: [String]?
答案 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)