在IOS领域主键中,如何更新数据,如果数据已经存在,则不需要两次更新?

在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 =

使用primaryKey offerName如何避免数据重复两次或更多时间

当我们使用该对象的didSelectRowAt时,如何编辑它并将数据更新到它的对象,而不是在更新时将其作为新对象

我怎么做

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%
}