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

In realm When ever i am updating it is updating only in 0th index how to solve it?

在我给定的领域 id = 0 并且它作为主键并且它将自动递增,但问题是更新它时保存在索引路径 0 中声明为 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"
    }
}

可能会担心排序问题,并且通常会通过添加 class var 来确定排序;例如时间戳,或者如果您想保留顺序,可以将对象添加到列表中,该列表保持顺序,如数组。

为了回答您的具体问题,您问题中的代码并不完整(部分来自 another question)。原因是对于每个创建的对象,必须先将其写入领域,然后下一个对象的主键基于先前的对象。

举个例子。

@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)
}

如您所见,每个对象都需要写入realm,以便下一个要查询的对象获取先前对象的主键。

这是一大堆潜在不必要的工作和代码。

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