在项目开始时,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)
}
}
现在我有了另一个视图控制器,可以使用下面的语言来更新对象。
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函数),当项目获得更多功能时它们将不能很好地工作,因此我回头看看是否可以重新设计创建或更新对象方法。
我用google搜索,有几种解决方案,例如,每次执行CRUD时,都制作UI对象并将ui值复制到领域对象中,使用内部领域对象(1对1映射)创建对象,或者我正在考虑部分更新,但不确定如何处理这种情况。理想情况下,我希望仅保留要更新的对象。有什么建议吗?
答案 0 :(得分:1)
如果您有一个现有的(托管)领域对象,则只能在写块内修改其属性。但是,它的任何属性都可以修改,实际上您只需要一个“样式”即可。
例如,如果我们有一个Note Realm对象
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)
}
您还可以扩展类或其他各种解决方案。通常,编写代码的规模很小,我将只在需要更新对象字段的地方使用它。