Ios 在域中,当我更新时,它仅在第0个索引中更新。如何解决它?

Ios 在域中,当我更新时,它仅在第0个索引中更新。如何解决它?,ios,swift,realm,primary-key,Ios,Swift,Realm,Primary Key,在领域i中,给定id=0,它作为主键,它将是自动递增的,但问题是在更新时,它正在索引路径0中保存为declare as id:Int=0 无论何时更新,它仅在第0个索引中更新 我想根据所选对象进行更新 怎么办 节目:- class Discount: Object { @objc dynamic var id : Int = 0 @objc dynamic var offerName : String = "" @objc dynamic var percentag

在领域i中,给定id=0,它作为主键,它将是自动递增的,但问题是在更新时,它正在索引路径0中保存为declare as id:Int=0

无论何时更新,它仅在第0个索引中更新

我想根据所选对象进行更新

怎么办

节目:-

class Discount: Object {


    @objc dynamic var id : Int = 0

    @objc dynamic var offerName : String = ""
    @objc dynamic var percentage: Float = 0.00
    @objc dynamic var segmentIndex : Int = 0
    @objc dynamic var dateWise: Date?


    override class func primaryKey() -> String? {
        return "id"
    }


   //Incrementa ID
    func IncrementaID() -> Int{
        let realm = try! Realm()
        if let retNext = realm.objects(Discount.self).sorted(byKeyPath: "id").last?.id {
            return retNext + 1
        }else{
            return 1
        }
    }
}

一般来说,自动递增的主键处理起来很有挑战性,并且可能会引起长期的头痛

通常最重要的是确保主键是唯一的,并且使用UUID字符串非常适合这一点

class Discount: Object {
    @objc dynamic var discount_id = UUID().uuidString

    override static func primaryKey() -> String? {
        return "discount_id"
    }
}
可能会有关于排序的问题,通常是通过添加一个类var来确定排序来管理的时间;例如,与时间戳类似,或者如果希望保持顺序,可以将对象添加到列表中,以保持顺序,就像数组一样

要回答您的特定问题,您问题中的代码不完整(部分是从中提取的)。原因是,对于创建的每个对象,必须首先将其写入领域,然后下一个对象的主键基于前一个对象

这里有一个例子

@objcMembers class User: Object {
   dynamic var uid: Int = 0
   dynamic var username: String?

    func getNextUid() -> Int {
        let realm = try! Realm()
        if let lastObject = realm.objects(User.self).sorted(byKeyPath: "uid").first {
            let lastUid = lastObject.uid
            let nextUid = lastUid + 1
            return nextUid
        }

        return 1
    }

    override static func primaryKey() -> String? {
        return "uid"
    }
}
现在使用它的顺序如下

let u0 = User()
u0.uid = u0.getNextUid()
u0.username = "User 0"

let realm = try! Realm()
try! realm.write {
    realm.add(u0)
}

let u1 = User()
u1.uid = u1.getNextUid()
u1.username = "User 1"

try! realm.write {
    realm.add(u1)
}
如您所见,每个对象都需要写入领域,以便查询下一个对象以获取先前对象的主键

这是一大堆可能不必要的工作和代码


我的建议是:坚持使用UUID().uuidString作为主键。

一般来说,主键的自动递增很难处理,并且可能会导致长期头痛

通常最重要的是确保主键是唯一的,并且使用UUID字符串非常适合这一点

class Discount: Object {
    @objc dynamic var discount_id = UUID().uuidString

    override static func primaryKey() -> String? {
        return "discount_id"
    }
}
可能会有关于排序的问题,通常是通过添加一个类var来确定排序来管理的时间;例如,与时间戳类似,或者如果希望保持顺序,可以将对象添加到列表中,以保持顺序,就像数组一样

要回答您的特定问题,您问题中的代码不完整(部分是从中提取的)。原因是,对于创建的每个对象,必须首先将其写入领域,然后下一个对象的主键基于前一个对象

这里有一个例子

@objcMembers class User: Object {
   dynamic var uid: Int = 0
   dynamic var username: String?

    func getNextUid() -> Int {
        let realm = try! Realm()
        if let lastObject = realm.objects(User.self).sorted(byKeyPath: "uid").first {
            let lastUid = lastObject.uid
            let nextUid = lastUid + 1
            return nextUid
        }

        return 1
    }

    override static func primaryKey() -> String? {
        return "uid"
    }
}
现在使用它的顺序如下

let u0 = User()
u0.uid = u0.getNextUid()
u0.username = "User 0"

let realm = try! Realm()
try! realm.write {
    realm.add(u0)
}

let u1 = User()
u1.uid = u1.getNextUid()
u1.username = "User 1"

try! realm.write {
    realm.add(u1)
}
如您所见,每个对象都需要写入领域,以便查询下一个对象以获取先前对象的主键

这是一大堆可能不必要的工作和代码


我的建议是:坚持使用UUID().uuidString作为主键。

我仍然尝试只在主键id=0时更新它only@ZaheerSk如何更新值?在其他视图控制器领域中使用此选项。添加(类别,更新:。已修改)我认为您可能错过了在将对象写入领域之前通过调用IncrementaID来实际增加id的部分。我仍然尝试只在主键id=0时更新它only@ZaheerSk如何更新值?在其他视图控制器领域中使用此选项。添加(类别,更新:。已修改)我认为您可能错过了在将对象写入领域之前通过调用IncrementaID来实际增加id的部分。