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

标签 swift database model realm

在项目开始的时候,Realm 很好用,而且项目越来越复杂,所以我需要弄清楚如何将 realm 层和 uiviewcontroller 解耦。

编写带参数的 Realm 对象有些尴尬。我想用参数更新对象,然后传递给 Realm 数据库以更新(表?)中的对象。最初,我有一个函数可以通过 -

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 函数),当项目获得更多功能时它们将无法正常工作,因此我退后一步看看是否可以重新设计创建或更新对象的方法。

我用谷歌搜索,有几种解决方案,比如制作 UI 对象并在每次执行 CRUD 时将 ui 值复制到 Realm 对象,使用内部 Realm 对象创建对象(1 对 1 映射),或者我正在考虑部分更新但不确定我该如何处理这种情况。理想情况下,我宁愿只保留要更新的对象。有什么建议吗?

最佳答案

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

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

Note: Object {
   @objc dynamic var body = ""
   @objc dynamic var textSize = 12
   @objc dynamic var language = "English"
}

任何时候我们都可以访问该 Note,我们可以在写闭包中修改它的属性。假设用户正在编辑现有笔记并更改正文,然后单击“保存”。

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)
}

请注意,这些 block 是相同的,只是更新了哪个属性。关键是在加载时挂起对笔记的引用,这样您就可以在保存时在写入 block 中修改它的属性。

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

一般来说它也可以被整合到一个函数中,像这样:

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)
}

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

关于swift - Realm 和 Swift - 为要更新的模型传递的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56194002/

相关文章:

ios - 在 Swift 中调用只有类名的初始化器

swift - 在 iPhone 中创建 UIPopOverController (Swift)

MySQL alter table enable keys 没有 promise 的那么快

java - 在 Adempiere 的模型类中添加确认(是/否)对话框

tensorflow - 如何将 tf.metrics.__ 与估计器模型预测输出一起使用

ios - 创建一个由图标制成的按钮,以便图标填充它

ios - 无法在 API 调用结束时隐藏事件指示器

database - 将 JSON 导入 ClickHouse

sql - 软删除是个好主意吗?

php - 如何按年份过滤laravel 4.2 app中的所有查询结果