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