You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:更适配「移动文件」需求的优化设计

移动文件本身不需要复制文件实体,调整数据结构可以避免冗余存储,性能更高:

  1. 给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"
    }
}
  1. 移动文件时只需要修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 01:36:10