如何存储连续位置数据的数据

How to store data for continous location data

我创建了一个简单的应用程序,它使用 GooglApiClient 每隔几秒读取一次位置数据(纬度、经度、速度、高度)。我想记录数据,这样我就可以计算并显示:距离、平均速度、最小和最大高度、地图上的轨迹等实时显示给用户。哪种数据存储方法最适合此目的?我不想从你那里看到这个方法的实现,只是想知道哪种方法最好。一直在考虑sqlite数据库,但是对于连续的读写操作来说,它是不是太慢了,太耗能了。

我认为 sqlite 足以让您每隔几秒存储一次位置数据。也可以将数据在内存中缓存一小段时间,一次性写入sqlite,减少I/O次操作。

据我所知,Android 中有四种存储数据的方法:

  • SQLite tables.
  • 共享首选项(本质上是键值对)。
  • 正在存储区中创建一个File
  • 将对象序列化为 String 并将其存储为键值对。

为了您的目的,我会说最好的方法是创建 SQLite tables。假设您的自定义 Location 对象包含 latitudelongitude,等等。因此,如果这些 Location 对象被转换为 table 中的行,那么您可以轻松检索这两种数据类型的整个列,即每个存储的 Location 个对象。

为了回答你的问题,我认为你需要更多地了解你将要记录多少数据(你跟踪多长时间)你需要对数据做什么(所有远程或发布到服务器等) .) 以及您的目标设备类型。我认为您的两个选择是 Sqlite 或存储为文件。从功率和速度的角度来看,这两个选项都应该没问题,主要的功率问题是您访问 GPS 传感器,而不是写入数据库或文件。

如果您选择写入文件,至少有 3 种(还有更多)有用的格式可以流式传输到您应该知道的文件中。他们是:

GPS Exchange Format 这是许多商业 gps 和卫星导航应用程序使用的开放标准,用于描述 waypoints、轨迹和路线

Geography Markup Language 这是一个开放的 xml 地理特征表达标准,几乎所有 GIS 应用程序都能理解

GeoJSON 是 json 中描述地理特征的标准,很容易在网络浏览器中呈现。

如果需要,您可以轻松地将 Sqlite 数据集序列化为这些文件格式以进行数据交换。关于流式传输到 Android 设备上的文件的一件事。无论您如何编写文件编写器,由于内存条件或用户优先级,它可能会被 OS 任意破坏。这很可能意味着您最终会得到格式错误的文件,其中的流未关闭。如果您正在写入数据表,则发生这种情况的可能性要小得多。

使用 SQLite 数据库可能是存储位置数据最简单和最安全的方法,但您必须意识到写入数据库会阻止读取操作。

Before modifying the database, the writer implicitly acquires an exclusive lock on the database which prevents readers from accessing the database until the write is completed.

因此,连续写入数据库会导致问题并影响应用程序的性能。

您可以通过启用预写日志记录 来避免这些问题,这样可以同时进行读取。

阅读更多内容:

考虑到您的任务上下文,我不会坚持使用Android的SQLite。由于您只使用了一堆原语而不是一组完全承诺的 POJO,因此启动 SQLite 的数据库助手、定义模式和处理查询是一个很大的开销。

我建议看一下 SnappyDb 库,它是键值数据库。

您可以单独处理每个原始值,也可以将它们包装到一个 POJO 中,SnappyDB 可以处理这两种情况。如果您选择第一种方式,可以使用一些方便的方法来查询多个键:keys search.

此外,SnappyDB 比 SQLite 快得多(请参阅其页面上的基准测试)。而且易于设置,只需几行代码。

希望对您有所帮助。