将一组图像上传到 coredata
Posted
技术标签:
【中文标题】将一组图像上传到 coredata【英文标题】:Upload an array of images to coredata 【发布时间】:2020-08-23 06:33:14 【问题描述】:当我只需要将一张图片上传到 coredata 时,我只有一个带有图片字段的实体餐厅,
然后,当我需要上传多张图片时,我创建了另一个名为 images 的实体,其中包含字段、图片和 id,餐厅中也有 id 字段,
现在,如果用户想要使用餐厅的多张图片,我使用 opalimagepicker 选择多张图片,然后返回一组 var arrayOfImages = [UIImage]()
对于单个图像,代码非常简单,我只需在 UIImageView 中显示图像,然后使用相同的图像上传到核心数据,如下所示
if let restaurantImage = cell5.imageToUpload.image
restaurant.image = restaurantImage.pngData()
但现在我希望将多个图像存储在图像实体中,每个图像对应于相同的 id ,即用户的 id 如下所示
image1 - abc
image2 - abc
再说一次,我知道如何在一个实体模型中上传单个图像,但如何在多个实体模型中上传图像数组
但是我不知道coredata的方法,谁能给我一个有用的方法来解决它,谢谢,我的关系模型已附上
餐厅实体中还有一个图片字段,如何调整?
UPADTE - 所以我可以使用它在 coredata 餐厅实体中保存图像数组。使用@danielson 指导
for image in arrayOfImages
print("saved")
restaurant.image = image.pngData()
但是在其他数据库中我不能使用 select 语句来查看数据是如何保存的,我没有任何方法可以找到它是如何完成的,
我如何从数组中提取第二个图像,目前只有一个图像,我正在这样做,这是为了从核心数据中获取数据并显示它,但是我现在如何从数组中显示某个图像?
if let restaurantImage = restaurant.image
cell.restaurantMiniImage.image = UIImage(data: restaurantImage as Data)
更新
import Foundation
import CoreData
extension Restaurant
@nonobjc public class func fetchRequest() -> NSFetchRequest<Restaurant>
return NSFetchRequest<Restaurant>(entityName: "Restaurant")
@NSManaged public var id: UUID?
@NSManaged public var image: Data?
@NSManaged public var isVisited: Bool
@NSManaged public var location: String?
@NSManaged public var name: String?
@NSManaged public var phone: String?
@NSManaged public var rating: String?
@NSManaged public var summary: String?
@NSManaged public var type: String?
@NSManaged public var images: NSSet?
// MARK: Generated accessors for images
extension Restaurant
@objc(addImagesObject:)
@NSManaged public func addToImages(_ value: Images)
@objc(removeImagesObject:)
@NSManaged public func removeFromImages(_ value: Images)
@objc(addImages:)
@NSManaged public func addToImages(_ values: NSSet)
@objc(removeImages:)
@NSManaged public func removeFromImages(_ values: NSSet)
import Foundation
import CoreData
extension Images
@nonobjc public class func fetchRequest() -> NSFetchRequest<Images>
return NSFetchRequest<Images>(entityName: "Images")
@NSManaged public var id: UUID?
@NSManaged public var image: Data?
@NSManaged public var origin: Restaurant?
var arrayOfImages = [UIImage]()
func getAssetThumbnail(assets: [PHAsset]) -> [UIImage]
for asset in assets
let manager = PHImageManager.default()
let option = PHImageRequestOptions()
var image = UIImage()
option.isSynchronous = true
manager.requestImage(for: asset, targetSize: CGSize(width: 100, height: 100), contentMode: .aspectFit, options: option, resultHandler: (result, info)->Void in
image = result!
self.arrayOfImages.append(image)
)
return arrayOfImages
【问题讨论】:
建立“多人”关系对你有用吗?您可以以这种方式存储具有相同餐厅来源的多张图像。 @aswath - 它是一对多,但我不知道 coredata 查询能够在图像实体中插入图像,这将对应于餐厅用户的 id @JoakimDanielson - 感谢我是 coredata 的新手,我最终使用了 classDefinition codegen 选项而不是 manual,因此我没有在我的导航器中获得类 Restaurant,但是现在我尝试使用代码和手动选项我在每次使用 Restaurant 关键字访问该实体的地方都会出错,我该如何继续? 【参考方案1】:您的Restaurant
类将有一个您可以使用的函数addToImages
。所以这样的事情应该可以工作
为Images
(实际上应该命名为Image
)创建一个自定义的init方法来简化其余代码
extension Images
convenience init(context: NSManagedObjectContext, image: UIImage)
self.init(context: context)
self.id = UUID()
self.image = image.pngData()
然后
var arrayOfImages = [UIImage]()
for image in arrayOfImages
restaurant.addToImages(Images(context: moc, image: image))
或者一次性
restaurant.addToImages(Set(arrayOfImages.map Images(context: moc, image: $0 ))
在上述代码示例中,moc
是NSManagedObjectContext
的一个实例。
要访问图像,您可以读取 Restaurant
的 images
属性,例如像这样获取 UIImage 数组
let imageArray = restaurant.images.map UIImage(data: $0.image as Data)
关于Restaurant
中的image
属性:您可以删除核心数据模型中不再使用的任何属性
【讨论】:
谢谢,那么图像实体的用途是什么,图像数据会自动输入它,我将如何检索这些图像?我不知道 coredata 因此问跨度> 所以现在我可以保存所有图像,目前我使用此代码显示核心数据中的图像 -- if let restaurantImage = restaurant.image cell.restaurantMiniImage.image = UIImage( data: restaurantImage as Data) ---- 但是假设我尝试在数组中显示第二张图像并使用 restaurant.image[1],它给出的错误,我做错了什么,谢谢 所以现在我使用 arrayOfImages print("saved") restaurant.image = image.pngData() 保存了数据,我想知道如何检索它才能如果图像访问特定的图像表单数组 您可以使用 Restaurant 类中的images
属性访问图像,该属性返回一组 Images
。
Joakim Danielson,谢谢,但我现在正在运行您的代码,现在我已经手动编译类但我不断收到错误 - 调用实例方法“addToImages”没有完全匹配,这是我在我的类 - @objc(addImages:) @NSManaged public func addToImages(_ values: NSSet)以上是关于将一组图像上传到 coredata的主要内容,如果未能解决你的问题,请参考以下文章