ios swift 模型结构与领域数据库

ios swift models structure with realm database

我正在开发我的 iOs 应用程序并且我正在使用 Realm 数据库。由于我对 ios 开发(还有 swift 和 xcode)完全陌生,所以我对结构化数据有疑问(我已经阅读了一些通用的项目结构指南,但找不到答案).我的想法与Java结构有关

对于 Realm 数据库 (RealmSiwft),我创建了一个这样的模型:

@objcMembers class Patient: Object {
    dynamic var patientId:Int = 0
    dynamic var refNumber:String = ""

    convenience init(id:Int, refNumber:String){
       self.init()
       self.patinetID = id
       self.refNumber = refNumber
    }
}

现在,它看起来就像 Java 中的 POJO class。但据我所知,这个模型结构是这样制作的,所以它可以使用 Realm。

所以问题是,如果我需要在我的项目中的其他地方使用 Patient 对象,这个 Realm-POJO-model 好用吗?我的意思是,即使我不需要对它进行数据库操作,我是否应该像普通模型一样使用它?或者我应该让这个 Realm 模型类似于 DAO class 来进行数据库操作,并在我想在不使用数据库的情况下与 Patient 一起玩时制作另一个模型 class 就像 Patient.swift (我希望不会,因为它是这么多代码重复)

如果我需要患者模型中不会存储在数据库中的变量怎么办?我可以在没有动态的情况下做到吗?初始化比什么?这让我大吃一惊,据我所知 swift 它看起来很丑陋而且没有结构,或者我还不能切换到它...

if I need somewhere else in my project to use Patient objects, is this Realm-POJO-model good to use? even when I dont need to make database operations on it?

您可以在不保存到数据库的情况下使用您的 Patient 对象,将它们移动到不同的控制器等等。

what if I need variables in that Patient Model that won't be stored in database?

查看 ignoredProperties() 方法。

Can I make it without dynamic?

不,你不能因为 Realm 基于 Objective-C 对象,所以这是必要的类型。

What about init than?

您可以创建不同的构造函数方法,请查看 Initialization 文档。在 Realm 的情况下,您应该为注意的变量设置值(如果您不给它们默认 属性 值)

您的 class 应如下所示:

class Patient: Object {

    // MARK: - Properties
    @objc dynamic var patientId: Int = 0
    @objc dynamic var refNumber: String = ""

    // MARK: - Meta
    // to set the model’s primary key
    override class func primaryKey() -> String? {
        return "patientId"
    }

    //Ignoring properties
    override static func ignoredProperties() -> [String] {
       return ["tmpID"]
    }

    //It's ok
    convenience init(id:Int, refNumber:String){
        self.init()
        self.patientId = id
        self.refNumber = refNumber
    }
}

您可以在以下位置找到所有其他详细信息:realm docs

您还可以使用 swift 扩展名扩展您的基本代码:

extension Patient {
    var info: String {
        return "\(patientId) " + refNumber
    }

    func isAvailableRefNumber() -> Bool {
        return refNumber.length > 6
    }
}