如何使用 LIKE/CONTAINS 查询领域 swift 中的双精度值

How to use LIKE/CONTAINS query for double value in realm swift

Realm LIKE/CONTAINS 适用于字符串值。如何搜索与 LIKE/CONTAINS

相同的 Double 值
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", amount:10.00
  2. id:"2", amount:100.00
  3. id:"3", amount:101.00
  4. id:"3", amount:200.00

searchProductByAmount(searchValue:10) // 应该 return 10, 100, 101 条记录

只要通过 searchAmount 引用 searchProductByAmount 函数中的 searchValue: Double 参数,printf 语法就需要 %f 符号表示双精度。 %@ 用于对象或字符串。

As indicated here..

您可以将双精度值存储为字符串并使用 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)")
        }
    }
}