Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Realm和Swift-要更新的模型要传递的参数_Swift_Database_Model_Realm - Fatal编程技术网

Realm和Swift-要更新的模型要传递的参数

Realm和Swift-要更新的模型要传递的参数,swift,database,model,realm,Swift,Database,Model,Realm,在项目开始时,Realm非常好用,而且很容易操作,而且项目变得越来越复杂,所以我需要弄清楚如何将Realm层和uiviewcontroller解耦 编写带有参数的领域对象会有些尴尬。我希望使用参数更新对象,然后传递到领域数据库以更新(表?)中的对象。最初,我有一个函数来编写领域对象- func createOrUpdateNote(note : Note, body : String, textSize : Float, toggleColor : Int) { let real

在项目开始时,Realm非常好用,而且很容易操作,而且项目变得越来越复杂,所以我需要弄清楚如何将Realm层和uiviewcontroller解耦

编写带有参数的领域对象会有些尴尬。我希望使用参数更新对象,然后传递到领域数据库以更新(表?)中的对象。最初,我有一个函数来编写领域对象-

func createOrUpdateNote(note : Note, body : String, textSize : Float, toggleColor : Int) {
        let realm = try! Realm()
        do {
            try realm.write {
                if note.id == -1 {
                    note.id = NoteManager.createNotePrimaryId()
                }
                note.body = body
                note.textSize = textSize
                note.toggleColor = toggleColor
                realm.add(note, update: true)
            }
        }
        catch {
            print(error.localizedDescription)
        }
    }
我想有这样的功能。希望这能澄清我的问题

func createOrUpdateNote(note : Note) {
            let realm = try! Realm()
            do {
                try realm.write {
                    realm.add(note, update: true)
                }
            }
            catch {
                print(error.localizedDescription)
            }
        }
现在,我有了另一个viewcontroller,可以使用下面的语言来更新对象

func createOrUpdateNote(note : Note, language : String) {
            let realm = try! Realm()
            do {
                try realm.write {
                    if note.id == -1 {
                        note.id = NoteManager.createNotePrimaryId()
                    }
                    note.language = language
                    realm.add(note, update: true)
                }
            }
            catch {
                print(error.localizedDescription)
            }
        }
数据库层将有两个类似的函数(dup函数),当项目获得更多功能时,这两个函数将无法正常工作,因此我将后退一步,看看是否可以重新设计“创建或更新对象”方法

我在谷歌上搜索过,有几种解决方案,比如每次我做CRUD时,都会将UI对象和UI值复制到领域对象上,用内部领域对象创建对象(1到1映射),或者我正在考虑部分更新,但不确定如何处理这种情况。理想情况下,我只希望对象被更新。有什么建议吗?

如果您有一个现有(托管)领域对象,则只能在写块中修改其属性。但是,它的任何属性都可以修改,您实际上只需要一个块“样式”即可

例如,如果我们有一个Note领域对象

Note: Object {
   @objc dynamic var body = ""
   @objc dynamic var textSize = 12
   @objc dynamic var language = "English"
}
只要我们有权访问该注释,就可以在写闭包中修改它的属性。假设用户正在编辑现有注释并更改正文,然后单击“保存”

let realm = try Realm()

try! realm.write {
     myNote.body = updatedBodyText
     realm.add(myNote, update: true)
}
或者改变文本大小

let realm = try Realm()

try! realm.write {
     myNote.textSize = updatedTextSize
     realm.add(myNote, update: true)
}
请注意,这些块是相同的,不同于更新的属性。关键是在加载时保留对注释的引用,以便保存时可以在写块中修改其属性

根据要保存的属性,使用多个写块是没有问题的。这实际上取决于您的用例,但这是常见的做法

一般来说,它也可以被合并成一个函数,类似这样:

func saveMyNote(myNote: NoteClass, updatedData: String, fieldType: NoteFieldTypes) {

   try! realm.write {
      switch fieldType:
      case .body:
         myNote.body = updatedData
      case .language:
         myNote.language = updatedData
      etc etc

      realm.add(myNote, update: true)
}

您还可以扩展该类或其他各种解决方案。一般来说,编写代码非常小,我只会在需要更新对象字段的任何地方使用它。

您能澄清问题所在吗?该代码用于创建或更新领域对象,因此不清楚哪些不起作用。问题在于领域的设计模式。如果没有写块,我无法使用某个变量更新领域对象。因此,我需要将参数从UI传递到数据库管理器类。是否有方法更新对象,然后更新数据库中的对象?我想有一个模型控制器,并在那里用参数更新领域对象。你能提供一个例子,说明什么时候你想更新一个对象变量,而不是将它写入领域吗?似乎您有一个具有三个属性的note对象:body、textSize和color。例如,如果用户打开一个便笺并更改了正文,那么下一步就是保存它,这将在写入过程中完成。在这个过程中,哪里需要更新var而不是编写var?我们的应用程序对此有一个特定的用例,所以我可能有一个答案,但我想首先确保问题是清楚的。我想我对这个问题不清楚。我有一个ViewController和NoteManager。NoteManager具有创建、删除、更新和获取注释的功能。我只想保留一个更新函数,而不是为参数保留几个“更新”函数。这违反了重复代码规则,但realm不允许我们事先更新注释,然后在realm中更新注释。我想知道还有没有别的办法。问题更多的是设计模式?感谢您的阅读/输入。它仍然非常不清楚。没有重复代码规则-您可以以任何方式复制代码。维护较小的代码库更有效,这也使其更易于维护。我们有一个内部使用的notes应用程序。当用户选择一个便笺时,便笺将在一个工作表(这是macOS桌面)中打开,用户可以在其中进行编辑,然后单击“确定”时,便笺将被添加或更新。所有这些都是通过一个写函数和一段代码完成的。实际上没有太多,所以不清楚为什么会有几个更新功能;这一切都可以一次完成。这就是我想要的答案,谢谢!我没有想到枚举-字段类型:NoteFieldTypes。。。这样做很酷。