【问题标题】:Swift Realm - writing a generi Primary Key Autoincrement functionSwift Realm - 编写一个通用的主键自动增量函数
【发布时间】:2017-03-25 04:04:40
【问题描述】:

所以在:

  1. How do I set a auto increment key in Realm?
  2. Realm and auto increment Behavior (Android)
  3. https://github.com/realm/realm-java/issues/469

它说,Realm 不支持主键自动增量。好的,所以我想自己添加。链接的帖子显示了这样做的方法。

问题:建议的解决方案需要自己为每个模型类手动添加 getNextPrimaryId() 函数。这样做似乎非常愚蠢。我尝试自己在 Swift 中编写一个通用的,所以我只需要这样做一次,它会自动应用于我的所有模型类,但我失败了 - 因为我在 Swift 中不是那么好。

尝试 1:

extension Object {
    func autoIncId() -> Int {
        let objects = Database.realm.objects(self).sorted("id")
        // Filter the max id here and return + 1
    }
}

尝试 2:

class Database {    
    static func autoIncId(type: Object) -> Int {
        let currentId = Database.realm.objects(type.self).map{$0.id}.maxElement ?? 0
        return currentId + 1
    }
}

两者都没有编译,因为 "Cannot convert value of type "Object" to expected argument type "Object.Type"".

有人知道如何编写自动适用于所有模型的通用函数吗?我只是想打电话给MyModelClass.autoIncId() 来获取下一个ID...

【问题讨论】:

    标签: swift realm


    【解决方案1】:

    假设您使用的是 Swift 3,您应该使用以下内容:

    type(of: self)
    

    但是,您为什么需要一个自动递增字段?如果您想要一个唯一的密钥,只需使用 UUID。当您希望您的应用在多个设备(例如 iPhone 和 iPad)之间同步时,自动递增字段会给您带来很大的问题。

    【讨论】:

    • 嗯,谢谢。但这仍然给我留下了编译器不知道“id”属性的问题,因为“Object”没有。 AFAIK 领域中没有“从对象 xy 的 db 获取属性”。那么,如果由于编译器类型限制而无法通过属性访问它,我该如何获取所选对象的 id 属性呢?
    • 你可以得到它,因为领域对象继承自 NSObject - 使用value(forKey:),所以你会使用$0.value(forKey: "id")。但是,如果您使用 sorted 方法,则无论如何您只是将其作为字符串。不过,我强烈建议使用自动递增属性是个坏主意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-02
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多