【问题标题】:How to store ArrayList<LatLng> on Sqlite database?如何在 Sqlite 数据库上存储 ArrayList<LatLng>?
【发布时间】:2015-05-17 10:36:40
【问题描述】:

我正在开发一个跟踪用户移动的应用。在每个onLocationChanged() 上,我将纬度和经度存储在ArrayList&lt;latLng&gt; 中,然后在路线上绘制一条折线。现在,当activity 停止时,我想保存所有用户的活动信息,例如:

  • 距离
  • 平均配速
  • 持续时间
  • 所有 ArrayList latlng 活动点

在Sqlite 数据库上稍后恢复它并用这些点绘制一条折线。 我不知道如何将纬度和经度的ArrayList 存储到数据库中的问题。 任何人都可以帮忙吗?

我的解决方案编辑,也许会对某人有所帮助!

public class SQLUtils extends SQLiteOpenHelper {

private static final String DB_NAME = "data.db";
private static final int DB_VERSION = 1;
private static final String run_table = "Run_table";
private static final String locationPoints = "Location_points";

public SQLUtils(Context context) {
    super(context, DB_NAME, null, DB_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
    Log.d("DB", "onCreate");

    String runTable = "create table " + run_table + "(ID VARCHAR(10), PACE VARCHAR(10), DURATION VARCHAR(10), DISTANCE VARCHAR(10), DATE VARCHAR(10), TIME VARCHAR(10));";
    String LocationTable = "create table " + locationPoints + "(ID INTEGER, POSITION INTEGER, Latitude REAL, Longitude REAL);";

    db.execSQL(runTable);
    db.execSQL(LocationTable);
}

public void insertRunData(String id, String pace,String duration, String distance, String date, String time) {
    Log.d("DB", "onInsertRunData");

    SQLiteDatabase db = this.getWritableDatabase();

    String sql = "INSERT into " + run_table +
        " (ID, PACE, DURATION, DISTANCE, DATE, TIME) VALUES ('" + id + "','" + pace + "','" + duration + "','" + distance +
           "','" + date + "','" + time + "')";

    db.execSQL(sql);

    db.close();
}

    public void insertLatLng(String id, int position, double latitude, double longitude){
    SQLiteDatabase db = this.getWritableDatabase();

    String sql = "INSERT into " + locationPoints +
            " (ID, POSITION, LATITUDE, LONGITUDE) VALUES ('" + UUID.fromString(id) + "','" + Integer.toString(position) + "','"
             + String.valueOf(latitude) + "','" + String.valueOf(longitude) + "')";

    db.execSQL(sql);
    db.close();
}

运行片段类:

    private void saveSqlRun() {
    SQLUtils sqlUtils = new SQLUtils(getActivity());
    sqlUtils.insertRunData(currentRun.getId(), currentRun.getAveragePace(), currentRun.getRunDuration(),
            currentRun.getRunDistance(), currentRun.getRunDate(),currentRun.getRunTime());

    /* Save user Location points */
    for (int index = 0; index < currentRun.getLocationPoints().size(); ++index) {
        sqlUtils.insertLatLng(currentRun.getId(), index, currentRun.getLocationPoints().get(index).latitude, currentRun.getLocationPoints().get(index).longitude);
    }
}

这就是 run_rable 的样子:

这就是 Location_points 的样子:

【问题讨论】:

  • 循环遍历arraylist并单独存储每个条目

标签: java android sqlite arraylist


【解决方案1】:

首先阅读Sqlite

那么你应该阅读Content Providers

在您了解如何在 android 中使用 sqlite 后,请设计您的表格。我猜你会有一个带有列的表格:

 id, userId, lat, lng, timeStamp.

现在您可以轻松获取每个用户的位置和时间,并计算所有其余部分。

给你一个关于如何存储ArrayList的小提示,然后使用类似的东西:

ArrayList<ContentProviderOperation> ops
for (LatLng latLng : list) {
    ops.add(ContentProviderOperation.insert(Uri).withValue("userId", userId).withValue("lat", 32.3232)...build()
} 

getActivity().getContentResolver().applyBatch("AUTHORITY", ops)

【讨论】:

  • 谢谢,但我尝试了一些不同的方法,它有效!如果您查看我编辑的帖子并应用它是否是一个好的解决方案,我会很高兴!
  • 嗯...您应该在数据库中保留最小的可行信息。在您的情况下,您将保留易于计算的数据。只保留您需要的数据(正如我建议的那样)并根据需要计算其他变量
  • 我也知道现在你认为这是一种矫枉过正的做法,但请研究一下Content Providers。多花点钱是值得的
  • @royB,您会选择存储点的数组列表,还是像 TS 那样将每个单独的点保存为一行。有什么想法或技巧可以分享吗?亲切的问候
猜你喜欢
  • 2013-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多