В первичном ключе IOS Realm, как обновить данные, и если они уже существуют, они не должны занимать дважды? - PullRequest
0 голосов
/ 18 октября 2019

С помощью 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"
    }

}

Ответы [ 2 ]

1 голос
/ 18 октября 2019

Realm предоставляет несколько способов обновить свойства объектов.

Многое из этого ответа зависит от варианта использования - в данном примере кажется, что вы пытаетесь обновить свойство известного объекта, который имеетсуществующий первичный ключ.

Начиная с 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?), Который будет поддерживатьсяdataSource, обычно массив или для Realm, объект Results, который также работает.

var discountResults = Results<DiscountClass>

Когда пользователь выбирает строку для редактирования, этот индекс строки будет соответствовать индексу в discountResults. Я не знаю, как вы редактируете, поэтому давайте просто скажем, что когда пользователь выбирает строку, он может редактировать процент. Когда они завершены, обновление становится очень простым

try! realm.write {
    thisDiscount.percentage = "0.1" //updates this objects percent to 10%
}

Поскольку это известный объект, вы специально обновляете этот процент объектов, и он не будет создавать другой объект.

Если вы находитесь вВ ситуации, когда вы можете добавить новый объект вместо обновления существующего, вы можете использовать параметр realm.create и указать либо .modified, либо .all для параметра update. Отмечая, что .all может иметь много накладных расходов, так что, как правило, предпочтение отдается .modified.

Принимая во внимание, что для использования realm.create вам необходимо создать объект и назначить существующий первичный ключ, если вы хотите обновитьили новый уникальный первичный ключ, если вы хотите его создать.

Дополнительную информацию и полное объяснение см. в документации: Обновление объектов с помощью первичных ключей

0 голосов
/ 18 октября 2019

Это фрагмент кода, который обновляет существующие объекты первичным ключом

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
...