当没有关闭SQLite 3的连接时,数据停留在.db-wal或.db-shm文件中。

问题描述 投票:0回答:1

我在Android App中使用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个回答
0
投票

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

pragma wal_checkpoint

以确保所有的东西都被清除了。例如,你可以在打开你的db实例后就这样做。这将会把上次未保存的所有数据保存到主文件中。

© www.soinside.com 2019 - 2024. All rights reserved.