【问题标题】:Delete Realm Object By Value按值删除领域对象
【发布时间】:2022-01-07 05:55:27
【问题描述】:

我开始尝试 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"
    }
}

现在我正在将文件复制到组模型文件对象中,但我需要删除父对象。 把它想象成一个动作,我将文件移动到文件夹中。 我所做的是将文件的副本保存到文件夹中并从文件夹外部删除文件。

问题

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

我对问题的理解

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

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

【问题讨论】:

    标签: swift realm


    【解决方案1】:

    问题是这个声明

    我正在将文件移动到文件夹中

    虽然这可能是您想要做的,但您正在移动的对象实际上并没有被移动。当您将托管对象添加到 List 属性时,它会将 reference 添加到对象,而不是对象本身。

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

    但是,列表也可以包含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])
    

    导致一个组中包含两个仅出现在该组中的文件。

    另一种选择是简单地制作对象的副本

    让 objectCopy = MyObject(value: objectToCopy)

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

    【讨论】:

    • 嗨,Jay 非常感谢您的回答。这对我帮助很大。但我仍然面临的问题是我已经在 EmbeddedObject 中保存了数据,但我没有找到任何关于如何从 EmbeddedObject 读取数据的信息
    • @MuhammadAhmad 嵌入对象只是一个对象,并且像任何其他对象一样被“读取”。因此,例如,如果您想从组中读取第一个嵌入对象的属性,如我的回答所示,请从 Realm 中读取组,它将是 let fileName = group.files[0].fileName
    • 非常感谢。你是救主。 @Jay