【问题标题】:Data stay in .db-wal or .db-shm file when conection of SQLite 3 was not closed当 SQLite3 的连接未关闭时,数据保留在 .db-wal 或 .db-shm 文件中
【发布时间】:2020-06-02 07:51:19
【问题描述】:

我在我的 Android 应用程序中使用 SQLite3 从蓝牙 LE 存储数据。使用 SQLite 时有两种情况:

  • 首先当我扫描后检查蓝牙 LE 设备之前已经连接过。我打开连接,读取或保存数据,关闭连接没有问题。然后在设备资源管理器中,我只看到一个带有 .db 扩展名的文件,其中数据被正确存储。例如,我可以使用某些查看器阅读此文件:sqliteonline.com
  • 第二我在后台运行的服务中打开连接。尽管应用程序或活动不可见(我需要此功能),但该应用程序可以从 BLE 记录和存储数据。但是当系统终止服务或我从启动器终止应用程序时,连接不会关闭,并且可能会存储最后保存的数据的下两个文件(.db-wal 和 .db-shm)。我可以在 .db 文件中看到最后存储的数据,而其他文件无法为我打开和读取。该应用可以读取最后存储的数据(也可以从 .db-wal 和 .db-shm 文件中读取)。

我的问题是:这是正确的解决方案吗?是否可以让连接打开?例如,我不会删除某些系统清理程序最后存储的数据。另外,我想在应用程序开发期间查看我的所有数据。我在服务中调用 onDestroy 方法中的关闭连接,但我读到不建议发布。

@Override
public void onDestroy() {
    if(writableTestbedDb != null){
       writableTestbedDb.close();
    }
    if(testbedDbHelper != null) {
        testbedDbHelper.close();
    }
    Log.w(TAG, "SERVICE DESTROYED");
    this.stopSelf();
    super.onDestroy();
}

我使用单例设计模式进行数据库连接。

public static TestbedDbHelper getInstance(Context context) {

    if (mInstance == null) {
        mInstance = new TestbedDbHelper(context.getApplicationContext());
    }
    mInstance.setWriteAheadLoggingEnabled(false);
    return mInstance;
}

【问题讨论】:

    标签: android sqlite android-studio android-sqlite android-service


    【解决方案1】:

    发生这种情况是因为您使用了预写日志记录。我看到你有禁用它的代码,但不知何故你仍然使用它。尽管如此,这些文件(wal & shm)一般都可以,它们没有任何问题。 但是,如果您想确保只有一个文件 (.db),您可以在代码中的某处执行:

    pragma wal_checkpoint
    

    确保一切都被清除。例如,您可以在打开数据库实例后立即执行此操作。这会将上次未保存的所有数据保存到主文件中。

    【讨论】:

      猜你喜欢
      • 2018-10-26
      • 2014-02-10
      • 1970-01-01
      • 2021-11-13
      • 2011-12-08
      • 1970-01-01
      • 2013-09-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多