【问题标题】:How to store data for continous location data如何存储连续位置数据的数据
【发布时间】:2015-03-08 11:21:04
【问题描述】:
我创建了一个简单的应用程序,它使用GooglApiClient 每隔几秒读取一次位置数据(纬度、经度、速度、高度)。我想记录数据,以便能够实时计算并向用户显示:距离、平均速度、最小和最大高度、地图上的轨迹等。哪种数据存储方法最适合此目的?我不想从你那里看到这个方法的实现,只想知道哪种方法最好。我正在考虑使用 sqLite 数据库,但是对于连续的读写操作来说,它是不是太慢且太耗电了。
【问题讨论】:
标签:
android
android-sqlite
android-location
【解决方案1】:
据我所知,在 Android 中有四种存储数据的方法:
- SQLite 表。
- 共享首选项(本质上是键值对)。
- 在存储区创建
File。
- 将对象序列化为
String 并将其存储为键值对。
出于您的目的,我想说最好的方法是创建 SQLite 表。假设您的自定义 Location 对象包含 latitude 和 longitude 等。因此,如果将这些Location 对象转换为表中的行,那么您就可以轻松地检索这两种数据类型的整列,即存储的每个Location 对象的所有位置数据。
【解决方案2】:
要回答您的问题,我认为您需要更多地了解您将记录多少数据(您要跟踪多长时间)您需要对数据做什么(所有远程或发布到服务器等)以及您针对的是哪种设备。我认为您的两个选项是 Sqlite 或存储为文件。从功率和速度的角度来看,这两个选项都应该没问题,主要的功率问题是您访问 GPS 传感器,而不是写入数据库或文件。
如果您选择写入文件,则至少有 3 种(并且还有更多)有用的格式可以将文件流式传输到您应该注意的格式。它们是:
GPS Exchange Format 这是许多商业 GPS 和卫星导航应用程序使用的开放标准,用于描述航路点、轨迹和路线
Geography Markup Language 是一个开放的 xml 标准,用于表达几乎所有 GIS 应用程序都可以理解的地理特征
GeoJSON 是一种用 json 描述地理特征的标准,然后很容易在网络浏览器中呈现。
如果您需要,您可以轻松地从 Sqlite 数据集序列化为这些文件格式以进行数据交换。关于流式传输到 Android 设备上的文件的一件事。无论您如何编写文件编写器,由于内存条件或用户优先级,它可能会被操作系统任意破坏。这很可能意味着您最终会得到流未关闭的格式错误的文件。如果您正在写入数据表,则发生这种情况的可能性要小得多。
【解决方案3】:
我认为 sqLite 足以让您每隔几秒钟存储一次位置数据。也可以在内存中短暂缓冲数据,一次性写入sqlite,减少I/O操作。
【解决方案4】:
使用 SQLite 数据库可能是存储位置数据的最简单和最安全的方式,但您必须注意,写入数据库会阻止读取操作。
在修改数据库之前,写入者隐式获取一个
数据库上的排他锁,阻止读者访问
数据库,直到写入完成。
因此,连续写入数据库可能会导致问题并影响应用程序的性能。
您可以通过启用预写日志记录来避免这些问题,该日志记录允许同时进行读取。
阅读更多:
【解决方案5】:
考虑到您的任务上下文,我不会坚持使用 Android 的 SQLite。由于您只使用一堆原语而不是一组完全承诺的 POJO,因此启动 SQLite 的数据库助手、定义模式和处理查询是相当大的开销。
我建议查看SnappyDb 库,它是键值数据库。
您可以单独处理每个原始值,也可以将它们包装到 POJO 中,SnappyDB 可以处理这两种情况。如果选择第一种方式,有很方便的方法可以查询多个key:keys search。
此外,SnappyDB 比 SQLite 快得多(请参阅他们页面上的基准测试)。并且易于设置,只需几行代码。
希望对你有帮助。