iOS Realm开发:移动FilesModel到GroupsModel后删原对象同步删副本如何解决
问题根因
你的分析方向是对的,但本质是Realm托管对象的特性导致的:所有已经写入Realm的Object子类实例,本质都是数据库中对应记录的代理,哪怕你把同一个实例添加到多个List集合中,指向的都是同一条数据库记录,只要删除这条记录,所有关联的地方都会同步消失。你之前尝试的深拷贝、detached对象没有生效,大概率是因为你写入新对象时复用了原来的主键id,Realm会判定为更新原有记录而非创建新的独立记录。
解决方案
方案1:需要文件独立副本时的正确实现
如果你需要分组内的文件和原文件完全独立,修改互不影响,需要手动创建全新的FilesModel实例,分配新的唯一主键,再写入Realm:
import RealmSwift // 假设originalFile为待移动的原文件实例,targetGroup为目标分组实例,realm为当前Realm实例 try! realm.write { // 1. 创建全新的FilesModel实例,生成新的唯一id let copiedFile = FilesModel() copiedFile.id = // 此处替换为你生成唯一主键的逻辑,不能和原有文件id重复 copiedFile.fileName = originalFile.fileName copiedFile.dateOfCreation = originalFile.dateOfCreation copiedFile.dateOfModification = Date() // 移动场景可以更新修改时间 copiedFile.type = originalFile.type // 复制二进制内容列表 originalFile.file.forEach { copiedFile.file.append($0) } // 2. 写入新文件到Realm,添加到目标分组 realm.add(copiedFile) targetGroup.files.append(copiedFile) // 3. 删除原文件,此时新文件不受影响 realm.delete(originalFile) // 更新分组文件数 targetGroup.filesCount = targetGroup.files.count }
方案2:更适配「移动文件」需求的优化设计
移动文件本身不需要复制文件实体,调整数据结构可以避免冗余存储,性能更高:
- 给
FilesModel新增分组关联字段:
class FilesModel: Object { @objc dynamic var id : Int = 0 @objc dynamic var fileName = "" @objc dynamic var dateOfCreation = Date() @objc dynamic var dateOfModification = Date() @objc dynamic var type = "" var file = List<Data>() // 新增关联分组id,0代表未分组/根目录 @objc dynamic var groupId: Int = 0 override static func primaryKey() -> String? { return "id" } }
- 移动文件时只需要修改
groupId即可,不需要增删文件实体:
try! realm.write { originalFile.groupId = targetGroup.id originalFile.dateOfModification = Date() // 分组的文件列表直接通过过滤查询获取即可,不需要手动维护 // let groupFiles = realm.objects(FilesModel.self).filter("groupId == %@", targetGroup.id) }
内容的提问来源于stack exchange,提问作者Muhammad Ahmad
相关产品推荐
相关产品推荐

