在领域中,当我更新它时,它只在第 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 作为主键。
在我给定的领域 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 作为主键。