Search code examples
iosswiftrealm

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


Realm LIKE/CONTAINS works for string values. How to search Double value for that works same as 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
}

Product Model Records:

  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) // should return 10, 100, 101 records


Solution

  • You can store your double values as strings and use LIKE and 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)")
            }
        }
    }