Удаление строк базы данных на основе текущего местоположения - PullRequest
3 голосов
/ 25 октября 2011

Я храню объекты с позицией (широта / долгота) в обычной базе данных SQLite в моем приложении Android.Приложение получает сообщения (UDP-пакеты) с новыми объектами, которые хранятся в этой БД.

Чтобы избежать взрыва БД в одной точке и сохранить его легким, я хотел бы удалить все объекты, которые находятся дальше определенного радиуса навсегда.Управление БД осуществляется через класс DB-Adapter, реализующий Помощник по БД.

Поскольку я не хочу использовать приближения расстояния, я хотел бы использовать формулу haversine.Теперь у меня есть следующие вопросы:

  1. Как лучше всего реализовать эту задачу в легком интеллектуальном решении?
  2. Я думал об использовании AsyncTask для выполнения этой работы.Это рекомендуется?

1 Ответ

2 голосов
/ 25 октября 2011

Это метод, который я использовал для получения условия сортировки для объектов с данными GPS, хранящимися в базе данных:

public String getOrderString(double latitude, double longitude) {
    double fudge = Math.pow(Math.cos(Math.toRadians(latitude)), 2);

    return "((" + latitude + " - " + KEY_LATITUDE + ") * (" + latitude
            + " - " + KEY_LATITUDE + ") + (" + longitude + " - "
            + KEY_LONGITUDE + ") * (" + longitude + " - " + KEY_LONGITUDE
            + ") * " + fudge + ") ASC";
}

заимствовано из здесь . Мое понимание фактора помадки состоит в том, что он учитывает координаты, которые не находятся вблизи экватора. Это уравнение хорошо сработало для меня и довольно быстро.

Теперь, я думаю, вы можете использовать то же уравнение, выполнив что-то вроде:

public String getWhereString(double latitude, double longitude, double threshold) {
    double fudge = Math.pow(Math.cos(Math.toRadians(latitude)), 2);

    return "((" + latitude + " - " + KEY_LATITUDE + ") * (" + latitude
            + " - " + KEY_LATITUDE + ") + (" + longitude + " - "
            + KEY_LONGITUDE + ") * (" + longitude + " - " + KEY_LONGITUDE
            + ") * " + fudge + ") < " + threshold;
}

Тогда ваш метод удаления будет выглядеть так:

public int removeBuildingEntry(double latitude, double longitude, double threshold) {
    String where = getWhereString(double latitude, double longitude, double threshold)

    return db.delete(TABLE, where, null);
}

Единственная проблема заключается в том, что я не знаю единицы результата уравнения и, следовательно, что вы должны передать в качестве порога. В моей ситуации меня это не волнует, так как я хочу только заказ, но в вашем случае это может иметь значение. Вы можете поиграть с разными значениями или попытаться вычислить его, если вам нужно более точное число.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...