如何在SwiftData中存储多张图片?附现有模型代码
在SwiftData中实现多张图片存储的方案
要在SwiftData中存储多张图片,核心是利用它的关系型数据特性,把图片单独封装成模型类,和主模型建立一对多关联。具体实现步骤如下:
1. 创建独立的图片模型类
新建一个专门存储单张图片的@Model类,用.externalStorage属性修饰图片数据,适合存储大文件:
import Foundation import SwiftData @Model class PhotoModel { @Attribute(.externalStorage) var imageData: Data init(imageData: Data) { self.imageData = imageData } }
2. 修改主模型,添加一对多关联
把原模型中单个的photo字段替换成关联PhotoModel的数组,并设置删除规则为.cascade(删除主模型时自动删除关联的图片):
import Foundation import SwiftData @Model class SwiftDataModel { // Session Data var record_type: WorkRecordType var amount: Int var nameOfSession: String var date: Date var canvas: Data var taps: Int // 替换原单个photo字段为一对多关联 @Relationship(deleteRule: .cascade) var photos: [PhotoModel] = [] // Event Data var subject_type: EventType var name_of_event: String var event_date: Date var is_notified: Bool init(amount: Int = 0, nameOfSession: String = "", date: Date = .now, record_type: WorkRecordType = .dont_record, taps: Int = 0, name_of_event: String = "", event_date: Date = .now, subject_type: EventType = .other, is_notified: Bool = false) { // Session Data self.amount = amount self.nameOfSession = nameOfSession self.date = date self.canvas = Data() self.record_type = record_type self.taps = taps // Event Data self.name_of_event = nameOfSession self.event_date = event_date self.subject_type = subject_type self.is_notified = is_notified // 初始化图片数组为空 self.photos = [] } }
3. 操作多张图片的示例
添加图片
// 假设已经获取到UIImage实例image if let imageData = image.jpegData(compressionQuality: 0.8) { let photo = PhotoModel(imageData: imageData) mainModel.photos.append(photo) // 记得保存上下文 try? context.save() }
读取图片
for photo in mainModel.photos { if let image = UIImage(data: photo.imageData) { // 使用image } }
注意事项
.externalStorage属性会把大文件数据存储到磁盘而非数据库本身,避免数据库体积过大,提升性能。- 如果需要给图片添加额外信息(如拍摄时间、备注),可以直接在
PhotoModel中添加对应的字段(比如var captureDate: Date)。 - 删除主模型时,设置的
.cascade规则会自动删除所有关联的PhotoModel实例,无需手动清理。
内容的提问来源于stack exchange,提问作者Typical_0
相关产品推荐
相关产品推荐

