Я хотел бы создать простую функцию расстояния для заказа объектов, извлеченных из базы данных SQLite в Swift2. Я использую потрясающую структуру SQLite.swift.Как создать пользовательскую функцию типа безопасного в SQLite.swift?
С Ниже я мог бы принести ближайшие объекты:
db.createFunction("distance") { (args) -> Binding? in
assert(args.count == 4)
if let lat1 = args[0] as? Double, let lon1 = args[1] as? Double, let lat2 = args[2] as? Double, let lon2 = args[3] as? Double {
let deltaLat = lat1 - lat2
let deltaLon = lon1 - lon2
return deltaLat * deltaLat + deltaLon * deltaLon * 0.46512281898705
}
return nil
}
let queryString = "SELECT * FROM objects where lat != \"\" and lng != \"\" ORDER BY distance(lat, lng, \(lat), \(lng)) ASC LIMIT \(fetchLimit)"
let stmt = db.prepare(queryString)
for row in stmt {
print(row)
}
Но я хотел бы использовать Типобезопасное выражение SQL без использования строки запроса. Как добавить функцию, чтобы она могла работать так (здесь значения lat и lon являются значениями Expression, которые представляют расположение строк в таблице и centerLat, значения центраLon представляют центр, откуда я вычисления расстояния объектов):
for row in db.order(distance(lat, lon, centerLat, centerLon).limit(fetchLimit) {
print(row)
}
Пропущенный это без 'sqlite.swift' тега! В вашем определении и исходном SQL у вас есть 4 аргумента, но в вашей версии с типом безопасности у вас есть 2. Не могли бы вы обновить его, чтобы быть более представительным, что вы ищете? – stephencelis
@stephencelis Извините, но счастлив, что вы его нашли. Я обновил свой вопрос! – Csaba