【问题标题】:how to make realm CRUD operation in separate swift file?如何在单独的 swift 文件中进行领域 CRUD 操作?
【发布时间】:2018-05-10 01:48:24
【问题描述】:

我是 iOS 开发和编程的初学者,我正在尝试制作一个包含名为 RealmService 的领域 CRUD 操作的 swift 文件,因此我不必编写 do catch 块并尝试!到处都是领域,就像我下面的代码

import Foundation
import RealmSwift

class RealmService {

    var realm = try! Realm()

    func save(_ object: Object) {
        do {
            try realm.write {
                realm.add(object)
            }
        } catch {
            print("Failed to save \(object) in realm: \(error.localizedDescription)")
        }
    }

    func load(_ object: Object) -> Results<Object>? {
        return realm.objects(object.self)
    }

    func update(_ object: Object, with dictionary: [String: Any?]) {
        do {
            try realm.write {
                for (key, value) in dictionary {
                    object.setValue(value, forKey: key)
                }
            }
        } catch {
            print("Failed to update \(object) in realm: \(error.localizedDescription)")
        }
    }

    func delete(_ object: Object) {
        do {
            try realm.write {
                realm.delete(object)
            }
        } catch {
            print("Failed to delete \(object) in realm: \(error.localizedDescription)")
        }
    }
}

但在load 方法中,我在realm.objects(object.self) 行中收到错误,据说

无法将“对象”类型的值转换为预期的参数类型 '对象.类型'

我认为我在 realm.objects 中插入 object.self 时出错了。它应该是 element.type,但我不知道这个元素类型是什么,就像这张图片

如何从领域加载数据?遗憾的是,我只是通过使用realm.objects(object.self)从 youtube 教程中了解了一点

【问题讨论】:

  • 什么是Results&lt;Object&gt;
  • 我是新手,但据我所知,如果我们从领域数据库加载数据,数据类型应为 Result
  • 对。看起来返回值 (realm.objects(object.self)) 不是 Result&lt;Object&gt; 类型。
  • 我认为在 realm.objects 中插入 object.self 时会出错。它应该是element.type,但我不知道这个元素类型是什么像这张图片i.stack.imgur.com/TVIs6.png
  • 将鼠标悬停在变量上,按选项键并单击变量。应该告诉你类型。

标签: ios swift realm


【解决方案1】:

您正在通过对象进行选择工作,这是一个错误,因为它是对象类型Element.Type 所必需的,而不是对象本身

尝试使用这个

 func load<T: Object>(ofType: T.Type) -> Results<T> {

            return realm.objects(T.self)

    }

调用这个函数

class MyObject: Object {
     ...
    @objc dynamic var name = ""
    ...

   }
  .....
  ream.objects(MyObject.self)

【讨论】:

    【解决方案2】:

    我像这样使用带有 CRUD 的 ReamManager:

    import UIKit
    import RealmSwift
    
    class RealmManager {
    
        private let NotificationError = Notification.Name.Realm.realmErrorNotification
    
        var realm = try! Realm()
    
        func create<T: Object>(_ object: T) {
            do {
                try realm.write {
                    realm.add(object, update: true)
                }
            } catch {
                post(error)
            }
        }
    
        func create<T: Object>(_ objects: [T]) {
            do {
                try realm.write {
                    realm.add(objects, update: true)
                }
            } catch {
                post(error)
            }
        }
    
        func read<T: Object>(_ object: T.Type) -> Results<T> {
            let result = realm.objects(object.self)
            return result
        }
    
        func update<T: Object>(_ object: T, with dictionary: [String: Any]) {
            do {
                try realm.write {
                    for (key, value) in dictionary {
                        object.setValue(value, forKey: key)
                    }
                }
            } catch {
                post(error)
            }
        }
    
        func delete<T: Object>(_ object: T) {
            do {
                try realm.write {
                    realm.delete(object)
                }
            } catch {
                post(error)
            }
        }
    
        func post(_ error: Error) {
            NotificationCenter.default.post(name: NotificationError, object: error)
        }
    
        func observeRealErrors(in viewController: UIViewController, complation: @escaping (Error?) -> Void) {
            NotificationCenter.default.addObserver(forName: NotificationError, object: viewController, queue: nil) { (notification) in
                complation(notification.object as? Error)
            }
        }
    
        func stopObserveRealErrors(in viewController: UIViewController) {
            NotificationCenter.default.removeObserver(viewController, name: NotificationError, object: nil)
        }
    }
    

    也许这正是你想要的

    【讨论】:

      猜你喜欢
      • 2021-12-28
      • 2023-02-05
      • 2017-03-17
      • 1970-01-01
      • 2019-05-20
      • 1970-01-01
      • 1970-01-01
      • 2016-09-16
      • 1970-01-01
      相关资源
      最近更新 更多