我在 CoreData 中保存对象时遇到困难。 它之前工作正常,但我将三个变量从字符串更改为字符串数组...... 图像,图像描述和属性我有一个名为CoreDataHandler的文件,如下所示。
class CoreDataHandler: NSObject {
private class func getContext() -> NSManagedObjectContext {
let appDelegate = UIApplication.shared.delegate as! AppDelegate
return appDelegate.persistentContainer.viewContext
}
class func saveObject(name: String, type: String, description: String, image: [String], imageDesc: [String], attrib: [String], rating: String, address: String, lat: Double, long: Double, annoName: String) -> Bool {
//cost: String, openingTimes: String, pets: String,
let context = getContext()
let entity = NSEntityDescription.entity(forEntityName: "CastleSave", in: context)
let manageObject = NSManagedObject(entity: entity!, insertInto: context)
manageObject.setValue(name, forKey: "name")
manageObject.setValue(type, forKey: "type")
manageObject.setValue(description, forKey: "desc")
manageObject.setValue([image], forKey: "image")
manageObject.setValue([imageDesc], forKey: "imageDesc")
manageObject.setValue([attrib], forKey: "attrib")
manageObject.setValue(rating, forKey: "rating")
manageObject.setValue(address, forKey: "address")
manageObject.setValue(lat, forKey: "lat")
manageObject.setValue(long, forKey: "long")
manageObject.setValue(annoName, forKey: "annoName")
do {
try context.save()
return true
} catch {
return false
}
}
我使用以下代码保存为收藏夹
CoreDataHandler.saveObject(name: (txte?.name)!, type: (txte?.type)!, description: (txte?.description)!, image: (txte?.image)!, imageDesc: (txte?.imageDesc)!, attrib: (txte?.attrib)!, rating: (txte?.rating)!, address: (txte?.address)!, lat: (txte?.lat)!, long: (txte?.long)!, annoName: (txte?.annoName)!)
在我的数据模型中...我以前有image,imageDesc和attrib的属性作为String。
我将其更改为可转换,并将属性 CustomClass 更改为 [字符串],但我正在努力了解如何正确保存它。
谁能帮忙?
并不是说这是第一个示例,而是我无法理解您在哪里或如何创建此代码。当核心数据以这里的方式使用时,它使得帮助解决如此复杂的问题变得越来越困难。
创建模型时,应用应自动生成可用于直接与核心数据通信的文件。应该有与模型中名称相同的托管对象的子类。例如
let manageObject = NSManagedObject(entity: entity!, insertInto: context)
应改为
let castleSave = NSManagedObject(entity: entity!, insertInto: context) as! CastleSave
而且您应该能够像 castleSave.name = name
一样直接调用属性。
如果你有这个,你会发现你不能打电话给castleSave.image = [image]
因为如果正确完成,你的image
属性是一个Data
。所以你需要序列化这些东西。
因此,问题似乎是如何将图像数组转换为数据。我想JSONSerialization
加上base64
字符串编码应该可以:
func dataFromImageArray(images: [UIImage]) -> Data? {
let imageDataArray: [Data] = images.compactMap { UIImageJPEGRepresentation($0, 1.0) }
let imageBase64Array: [String] = imageDataArray.compactMap { $0.base64EncodedString() }
let jsonData: Data? = try? JSONSerialization.data(withJSONObject: imageBase64Array, options: [])
return jsonData
}
func imageArrayFromData(data: Data) -> [UIImage] {
guard let items = (try? JSONSerialization.jsonObject(with: data, options: [.allowFragments])) as? [String] else {
return []
}
let dataItems: [Data] = items.compactMap { Data(base64Encoded: $0) }
let images: [UIImage] = dataItems.compactMap { UIImage(data: $0) }
return images
}
对于可转换为数据的任何对象的数组,也可以执行非常相似的操作。