【问题标题】:Using Realm in iOS swift 4在 iOS Swift 4 中使用 Realm
【发布时间】:2018-08-30 12:53:34
【问题描述】:

我正在使用 Realm,它看起来不错。但我在这里感到困惑。因为我不知道 Realm 是如何工作的,以及它保存数据的结构是什么。

我基本上是一名 Android 开发人员,你可以说我是 iOS 的新手。所以在我的脑海里我在想会有一个数据库的主文件。然后在里面,会有不同的表,在表中我可以保存数据。

但我很惊讶我保存了数据,但它没有问我表名,我真的不知道如何在其中创建表。在 Java 中,我们首先创建表,然后将模型反映为数据库中该表中的行。我正在使用以下文件将数据保存在 Realm 中。请查看并清除以下混淆

  • 告诉我领域是如何工作的?
  • 如何在领域中创建表?
  • 如何检查数据库是否存在我的意思是数据是否已经保存?
  • 如何检查是否已经创建了任何表(国家表)以便检索数据?

并查看以下课程。它基本上是一个助手类。

   public class DbHelper {

    private init() {}

    static let sharedDbHelper = DbHelper()

    var realmObj = try! Realm()

    /**
     Generic function to create Object in the DB
     */
    func save <T: Object> (_ obj : T){

        do {
            try realmObj.write {
                realmObj.add(obj)
            }

        }catch{
            print("DbHelperException","Create",error)
        }
    }


    /**
     Generic function to update Object in the DB
     */
    func update <T: Object> (_ obj : T, with dictionary: [String : Any?]){
        do{
            try realmObj.write {

                for (key,value) in dictionary{
                    obj.setValue(value, forKey: key)
                }

            }
        }catch {
            print("DbHelperException","Update",error)
        }


    }

    /**
     Generic function to delete Object in the DB
     */
    func delete <T: Object> (_ obj : T){
        do {
            try realmObj.write {
                realmObj.delete(obj)

            }
        }catch {
            print("DbHelperException","Delete",error)
        }

    }

    /**
     Function to manage the error and post it
     */
    func postDbError(_ error : Error)  {

        NotificationCenter.default.post(name: NSNotification.Name(""), object: error)
    }

    /**
     Function to observe the error and post it
     */
    func observeDbErrors(in Vc: UIViewController, completion: @escaping  (Error?) -> Void) {
        NotificationCenter.default.addObserver(forName: NSNotification.Name(""), object: nil, queue: nil) { (notification) in
            completion(notification.object as? Error)
        }
    }


    /**
     Function to remove observer of the error
     */
    func stopDbErrorObserver (in Vc: UIViewController ){

        NotificationCenter.default.removeObserver(Vc, name: Notification.Name(""), object: nil)
    }
}

【问题讨论】:

    标签: ios realm


    【解决方案1】:

    我认为您所有的问题都与同一个问题有关,您认为 Realm Database 使用表工作,但是,事实并非如此,而是 Realm Database 使用 Realms。它们可以是本地的(您的情况)、内存中的或同步的。

    一个领域可以包含多种对象,这些对象代表您正在考虑的表格。

    • 如果您想拥有不同的表,解决方案是定义多个 RealmObject。

    • 要检查您的 Realm 是否不包含特定对象的任何实例,您可以执行以下操作:database.objects(YourRealmObject).isEmpty()

    【讨论】:

    • 我知道这些。但问题是,我没有写任何行来创建表。在 SQlite 中,我们需要先创建表,然后将数据放入其中。所以这意味着当我们存储模型的实例时,它会自己创建它的表??
    • 是的,这就是它的工作方式,当添加实例时,会创建“表”。
    【解决方案2】:

    Realm 中的“表”等价物是您定义为 class 的模型。你可以在这里阅读:https://realm.io/docs/swift/latest/#models

    这是 Realm 提供的一个示例:

    class Dog: Object {
      @objc dynamic var name = ""
      @objc dynamic var owner: Person? // Properties can be optional
    }
    

    所以在这种情况下,Dog 是您的表名,nameowner 是您的列名(每个都有特定的数据类型)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 2016-07-07
      相关资源
      最近更新 更多