在IOS领域主键中,如何更新数据,如果数据已经存在,则不需要两次更新?
使用primaryKey offerName如何避免数据重复两次或更多时间 当我们使用该对象的didSelectRowAt时,如何编辑它并将数据更新到它的对象,而不是在更新时将其作为新对象 我怎么做在IOS领域主键中,如何更新数据,如果数据已经存在,则不需要两次更新?,ios,swift,realm,primary-key,edit,Ios,Swift,Realm,Primary Key,Edit,使用primaryKey offerName如何避免数据重复两次或更多时间 当我们使用该对象的didSelectRowAt时,如何编辑它并将数据更新到它的对象,而不是在更新时将其作为新对象 我怎么做 import Foundation import RealmSwift class Discount: Object { @objc dynamic var offerName : String = "" @objc dynamic var percentage: Float =
import Foundation
import RealmSwift
class Discount: Object {
@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 "offerName"
}
}
这是一个用主键更新现有对象的代码段
guard let realm = try? Realm() else {
return
}
let discounts = realm.objects(Discount.self)
try? realm.write {
discounts.forEach { $0.dateWise = Date() }
realm.add(discounts, update: .all)
}
检查方法文档:
/**
Adds all the objects in a collection into the Realm.
- see: `add(_:update:)`
- warning: This method may only be called during a write transaction.
- parameter objects: A sequence which contains objects to be added to the Realm.
- parameter update: How to handle
without a primary key.
- parameter update: How to handle objects in the collection with a primary key that alredy exists in this
Realm. Must be `.error` for object types without a primary key.
*/
public func add<S: Sequence>(_ objects: S, update: UpdatePolicy = .error) where S.Iterator.Element: Objec
/**
将集合中的所有对象添加到域中。
-请参阅:`add(u:update:)`
-警告:此方法只能在写入事务期间调用。
-参数对象:包含要添加到领域的对象的序列。
-参数更新:如何处理
没有主键。
-参数更新:如何使用此集合中存在的主键处理集合中的对象
王国。对于没有主键的对象类型,必须为“.error”。
*/
public func add(u-objects:S,update:UpdatePolicy=.error),其中S.Iterator.Element:Objec
领域提供了几种更新对象属性的方法
这个答案很大程度上取决于用例——在这个例子中,您似乎试图更新一个已知对象的属性,而不是现有的主键
从DiscountClass开始-一个想法是offerName可能不是一个好的主键;如果您有两个相同名称的优惠,“10%折扣”很常见。最好使用UUID,然后将提供作为对象中的文本
class DiscountClass: Object {
@objc dynamic var discount_id = UUID().uuidString //guaranteed unique
@objc dynamic var offerName : String = ""
@objc dynamic var percentage: Float = 0.00
override class func primaryKey() -> String? {
return "discount_id"
}
}
根据您的问题,它们看起来像是在一个列表(tableView?)中显示的,该列表将由一个数据源支持,通常是一个数组或领域,一个同样有效的结果对象
var discountResults = Results<DiscountClass>
因为它是一个已知的对象,所以您正在专门更新该对象的百分比,并且它不会创建另一个对象
如果您可能正在添加新对象而不是更新现有对象,则可以使用realm.create选项并向update参数提供.modified或.all。需要注意的是。所有这些都可能有很多开销,所以一般来说。修改是首选
请记住,要使用realm.create,如果要更新,则需要创建对象并分配现有主键;如果要创建,则需要分配新的唯一主键
有关更多示例和完整解释,请参阅文档:单击(didSelectRowAt)时如何编辑我需要更新
请尝试realm.write{objectToUpdate.value=1;realm.add(objectToUpdate,update:.all)}
@ZaheerSk我不知道这个答案是否解决了问题。此示例遍历领域中的每个对象,并将其dateWise属性设置为新日期,然后将所有数据重新添加回领域(再次),这是不必要的,因为它已经存在。OP询问如何更新一个已知对象的属性,而这个答案没有。此外,使用.all进行更新会向Realm写入比.modified多得多的数据,因为它正在写入整个Realm中每个对象的每个属性,而我们实际上只需要一个属性。不过我可能完全看错了。
try! realm.write {
thisDiscount.percentage = "0.1" //updates this objects percent to 10%
}