如果未关闭SQLite 3的连接,数据将保留在.db-wal或.db-shm文件中。

时间:2020-06-02 07:51:19

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

我正在Android应用程序中使用SQLite3从Bluetooth LE进行数据存储。使用SQLite时会发生两次:

  • 首先,当我扫描后检查以前是否已连接Bluetooth 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;
}

1 个答案:

答案 0 :(得分:0)

发生这种情况是因为您使用预写日志记录。我看到您有禁用它的代码,但是仍然可以使用它。但是,这些文件(wal和shm)通常都可以,并且没有任何问题。 但是,如果要确保只有一个文件(.db),则可以在代码中的某个位置执行:

pragma wal_checkpoint

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

相关问题