根据当前位置删除数据库行

时间:2011-10-25 17:15:43

标签: android sqlite

我将位置(lat / long)的对象存储在Android应用程序的普通SQLite数据库中。应用程序接收带有存储在此DB中的新对象的消息(UDP数据包)。

为了避免DB在某一点爆炸并保持光亮,我想删除所有远离特定半径的物体。 DB通过实现DB Helper的DB-Adapter类来控制。

由于我不想使用距离近似,我想使用hasrsine公式。现在我有以下问题:

  1. 在轻量级智能解决方案中实施此任务的最佳方法是什么?
  2. 我想过使用AsyncTask来完成这项工作。这是推荐的吗?

1 个答案:

答案 0 :(得分:2)

这是我用来获取存储在数据库中的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";
}

here'借来'。我对软糖因素的理解是它考虑了不在赤道附近的坐标。到目前为止,这个等式对我来说效果很好,并且相当快。

现在,我认为您可以通过执行以下操作来使用相同的等式:

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);
}

唯一的问题是我不知道等式结果的单位,因此你应该把它作为一个阈值传递给你。在我的情况下,我不关心那些,因为我只想要订单,但在你的情况下可能会有所作为。如果您需要更准确的数字,您可以使用不同的值来尝试计算它。