按值删除领域对象

Delete Realm Object By Value

我开始为 IOS 尝试 Realm,所以我创建了两个 类:

文件模型

import Foundation
import RealmSwift

    class FilesModel: Object {
        
        @objc dynamic var id : Int = 0
        @objc var fileName = ""
        @objc dynamic var dateOfCreation = Date()
        @objc dynamic var dateOfModification = Date()
        @objc dynamic var type = ""
        var file = List<Data>()
    
    }

组模型

import Foundation
import RealmSwift

class GroupsModel: Object {
    
    @objc dynamic var id : Int = 0
    @objc dynamic var name = ""
    @objc dynamic var dateOfCreation = Date()
    @objc dynamic var dateOfModification = Date()
    @objc dynamic var filesCount = Int()
    var files = List<FilesModel>()
    
    override static func primaryKey() -> String? {
        return "id"
    }
}

现在我正在将文件复制到组模型文件对象中,但我需要删除父对象。 将其视为我将文件移动到文件夹中的举动。 我所做的是将文件的副本保存到文件夹中,然后从文件夹外删除文件。

问题

当我删除文件夹外的文件时,它也会删除文件夹内的文件。

我对问题的理解

类 是引用类型,所以我正在复制引用。因此,当我删除引用时,它会从整个项目中删除该文件。

我已经尝试了很多解决方案,比如深拷贝和分离。 提前致谢。

问题是这条语句

I am moving files into the folder

虽然这可能是您想要执行的操作,但您正在移动的对象实际上并没有被移动。当您将托管对象添加到列表 属性 时,它会向对象添加一个 引用 ,而不是对象本身。

换句话说,当 FilesModel 添加到 GroupsModel 文件列表 属性 时,它是对对象的引用。如果删除 FilesModel,它也会从列表中消失。但是,将其从列表中删除不会更改原始对象。

但是,列表也可以包含 Embedded Objects - 嵌入对象只存在于它的父对象中。也许这是一个选择?

原来如此。这里有几个模型

class FileModel: EmbeddedObject {
    @Persisted var fileName = ""
}

class GroupsModel: Object {
    @Persisted var files = List<FilesModel>()
}

然后实例化一个组并向其中添加几个文件对象

let group = GroupsModel()

let f0 = FileModel()
f0.fileName = "some filename"

let f1 = FileModel()
f1.fileName = "another filename"

group.files.append(objectsIn: [f0, f1])

生成一个包含两个只出现在该组中的文件的组。

另一种选择是简单地复制对象

let objectCopy = MyObject(value: objectToCopy)

然后将 objectCopy 添加到您的群组模型中。但是同样,通过这样做,Realm 将实例化 objectCopy 并将其实际添加回 Realm(可能会覆盖原始对象)。