Как использовать запрос LIKE / CONTAINS для двойного значения в realm swift - PullRequest
0 голосов
/ 01 апреля 2020

Realm LIKE / CONTAINS работает для строковых значений. Как искать Двойное значение для этого работает так же, как LIKE / CONTAINS

public class ProductModel: Object {
     @objc dynamic var id: String? = ""
     @objc dynamic var amount: Double = 0.0
}

func searchProductByAmount(searchValue:Double) -> Results<ProductModel> {
    let realm = RealmManager.Product
    let predicate = NSPredicate(format: "amount CONTAINS %@", searchAmount)
    let products = realm.objects(ProductModel.self).filter(predicate)
    return products
}

Записи модели продукта:

  1. id: "1", количество: 10.00
  2. id: "2", сумма: 100.00
  3. id: "3", сумма: 101.00
  4. id: "3", сумма: 200.00

searchProductByAmount (searchValue: 10) // должен возвращать 10, 100, 101 записей

Ответы [ 2 ]

2 голосов
/ 02 апреля 2020

Вы можете хранить свои двойные значения как строки и использовать LIKE и CONTAINS.

public class ProductModelS: Object {
    @objc dynamic var id: String? = ""
    @objc dynamic var amount: String = "0.0"

    convenience init(id: String?, amount: String) {
        self.init()
        self.id = id
        self.amount = amount
    }
}


class ProductModelTests: XCTestCase {

    func testDoubleAsString() {
        let models = [
            ProductModelS(id: UUID().uuidString, amount: String(format: "%.02f", 10.00)),
            ProductModelS(id: UUID().uuidString, amount: String(format: "%.02f", 100.00)),
            ProductModelS(id: UUID().uuidString, amount: String(format: "%.02f", 101.00)),
            ProductModelS(id: UUID().uuidString, amount: String(format: "%.02f", 200.00)),
        ]

        let config = Realm.Configuration(inMemoryIdentifier: UUID().uuidString)

        do {
            let realm = try Realm(configuration: config)
            try realm.write {
                realm.add(models)
            }

            let containsResults = realm.objects(ProductModelS.self)
                .filter("amount CONTAINS %@", "\(10)")
            let likeResults = realm.objects(ProductModelS.self)
                .filter("amount LIKE %@", "*\(10)*")
            print("CONTAINS: \(containsResults)")
            print("LIKE: \(likeResults)")
        } catch {
            print("Product model error \(error)")
        }
    }
}
0 голосов
/ 02 апреля 2020

Пока с помощью searchAmount вы ссылаетесь на аргумент searchValue: Double в searchProductByAmount fun c, синтаксису printf требуется символ %f для двойного символа. %@ для объекта или строки.

Как указано здесь ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...