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:
searchProductByAmount(searchValue:10) // should return 10, 100, 101 records
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)")
}
}
}