2010-02-28 26 views
6

Chúng tôi đang xây dựng một ứng dụng Android sẽ sử dụng vị trí hiện tại của người dùng (lat, long) và hiển thị top 50 địa điểm xung quanh vị trí hiện tại, được sắp xếp theo khoảng cách.Sqlite trên Android: Cách tạo hàm sqlite dist db - được sử dụng trong ứng dụng để tính khoảng cách bằng lat, dài

Chúng tôi có các địa điểm này được lưu trữ trong một DB SQLite. Chúng tôi dự định giao hàng với DB sqlite bằng ứng dụng.

Để chỉ tìm nạp 50 địa điểm gần nhất có liên quan, chúng tôi muốn xác định hàm db DIST (để tính khoảng cách giữa hai điểm) và sử dụng nó trong truy vấn của chúng tôi.

Tôi làm cách nào để xác định chức năng SQLite tùy chỉnh cho ứng dụng Android? Cuộc gọi API Java sẽ làm gì?

Chúng tôi đã thực hiện thành công phương pháp này trong App iPhone của chúng tôi - sử dụng Objective C.

+0

http://stackoverflow.com/questions/3126830/query-to-get-records-based-on-radius-in-sqlite – Pentium10

+0

xin chào làm cách nào bạn tích hợp trên ios ?? bởi vì tôi cần phải làm điều tương tự, cảm ơn –

Trả lời

5

Cập nhật: Câu trả lời là bạn không thể làm điều này.

từ: Android. Is it possible to write custom function on C/C++ and use it in SQL query?

+0

Josh, Cảm ơn bạn! Nếu bạn không phiền, bạn có thể vui lòng chỉ cho tôi một số mã mẫu không - tôi chắc chắn sẽ không phạm sai lầm. Cảm ơn một tấn! – Puneet

+2

org.sqlite không phải là API Android, do đó không liên quan. – hackbod

+1

Bạn đúng, org.sqlite không phải là API Android. Tuy nhiên, bạn có thể sử dụng nó để triển khai Nhà cung cấp nội dung thực hiện những gì anh ta yêu cầu. –

0

Nó có thể được thực hiện nhưng bạn không thể tải này vào cơ sở dữ liệu từ API Java. Bạn sẽ cần phải cung cấp triển khai thực hiện thư viện sqlite của riêng bạn, được mở rộng để cung cấp các hàm bạn muốn ở cấp C. Điều này không vui nhưng nó hoạt động tốt. Lưu ý rằng bạn có thể gặp sự cố với các thiết bị Android sử dụng kiến ​​trúc không chuẩn.

1

Giải pháp thay thế có thể là tìm nạp tất cả các bản ghi trong đó một trong các giá trị (nói, kinh độ) gần với vị trí hiện tại. Nếu bạn sử dụng cột này làm chỉ mục thì việc tìm nạp chúng sẽ rất nhanh.

Sau đó, bạn có một tập hợp con giảm nhiều để lặp lại so sánh vĩ độ và thực hiện các phép tính khoảng cách đầy đủ của bạn.

0

Tôi biết đây là một câu hỏi cũ, nhưng có một giải pháp dễ dàng hơn một chút tôi nghĩ.

Đây là một ví dụ, nhưng không thành công khi vượt qua 0 độ, mặc dù bạn có thể thay đổi tất cả vĩ độ/kinh độ để điều chỉnh.

Giải pháp tổng thể hoạt động khá tốt khi đặt hàng, nhưng chỉ sử dụng định lý Pythagore để tính khoảng cách tương đối (lưu ý: không có hàm gốc vuông trong sqlite, nhưng điều đó không liên quan).

String calcDistance = "(((abs(" + cLat + ") - " + Math.abs(lat) + ") * (abs(" + cLat + ") - " + Math.abs(lat) + "))" + 
        "+ ((abs(" + cLng + ") - " + Math.abs(lng) + ") * (abs(" + cLng + ") - " + Math.abs(lng) + "))) as calc_distance"; 

Nếu cần sửa khoảng cách này, bạn muốn điều chỉnh bằng cách thêm 90 vào tất cả các vĩ độ và 180 cho tất cả kinh độ. Sau đó, bạn có thể thoát khỏi các chức năng abs khó chịu đó.

Các vấn đề liên quan