android - 具有有限最大行数(通过选择)效率的 sqlite3 表

标签 android sql performance sqlite

我按时间间隔(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/

相关文章:

使用 CASE WHEN 进行 SQL 查询以透视列

python - QtSql 将 MySql 查询转换为 SQLite

c# - 用于加速电子邮件发送应用程序的多线程

sql - 在连续 block 中查询具有相同值的最后一条记录

三星tab2平板电脑安卓开发

java - 如何在 Android 10 (Android Q) 中访问外部存储?

javascript - 为什么我的默认页面在模拟器和浏览器中打开时不同? ( ionic /Angular 用户界面)

android:windowTranslucentStatus/fitsSystemWindows 工具栏大小错误

mysql - 如何在MYSQL中选择两个月份名称之间的记录

c++ - 性能调整推力应用程序