我按时间间隔(gps 位置)存储数据,我不希望数据库膨胀,所以我定义了它可以达到的最大行数,然后每次插入时它都会删除最旧的行新的。
现在一位数据库专家查看了我的代码,他说这种方法效率不高,因为从数据库中删除一行是最耗时/内存/过程的操作,我应该不惜一切代价避免它。
他说我应该改为在达到 MAX 后运行最旧的线路(更新)。 (所以每次都是从上到下)
这意味着我需要保存一个单独的“标题”表来保存我当前指向最旧行的指针并在每次插入时更新它(我不想在应用程序崩溃时丢失它).. 它真的更有效率吗?还有其他方法可以更有效地做到这一点吗?
最佳答案
把你的数据库表变成一个环形缓冲区是愚蠢的。 如果你真的想使用这种方法......
- 不要使用数据库,只使用数据文件和 IO
- 在您的数据文件中,每条记录的大小都是固定的
- [时间戳][纬度][经度]
- 您可以使用字符串格式或二进制表示数据,只要它们的大小固定即可。
------------gps.dat------------
[Ring Pointer]
[Time Stamp][Latitude][Longitude]
[Time Stamp][Latitude][Longitude]
...
[Time Stamp][Latitude][Longitude]
- Ring Pointer是一个长整数的二进制表示
- 当您第一次创建文件时,您会将其大小设置为 LONG_INTEGER_SIZE + (MAX_RECORDS * RECORD_SIZE)
当你想添加一条记录时:
- 从文件开头读取[Ring Pointer]
- 将 [Ring Pointer] + 1 写入文件的开头(这样人们就不会混淆保持 [Ring Pointer] 变量相同,只需将新值写回文件即可)
- 转到位置 LONG_INTEGER_SIZE + (([Ring Pointer] % MAX_RECORDS) * RECORD_SIZE)
- 在那个地方写下你的新记录
关于android - 具有有限最大行数(通过选择)效率的 sqlite3 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9579718/