Android删除SQL数据库

Android删除SQL数据库,android,database,sqlite,android-sqlite,android-external-storage,Android,Database,Sqlite,Android Sqlite,Android External Storage,我有一个奇怪的问题,当我卸载应用程序时,我的SQL数据库没有自动删除 我没有在任何外部存储目录中创建数据库,并且已确认数据库位于其默认位置:/data/data/com.example.app/databases/ 卸载应用程序后,我希望该位置的所有数据都会被删除,但当我从android studio再次运行应用程序时,新安装的应用程序仍然可以看到所有旧数据 我曾尝试使用adb从数据库目录中手动删除.db文件,但当我再次运行应用程序时,仍然可以看到旧数据 我也尝试过进入应用程序设置并清除数据和缓

我有一个奇怪的问题,当我卸载应用程序时,我的SQL数据库没有自动删除

我没有在任何外部存储目录中创建数据库,并且已确认数据库位于其默认位置:
/data/data/com.example.app/databases/

卸载应用程序后,我希望该位置的所有数据都会被删除,但当我从android studio再次运行应用程序时,新安装的应用程序仍然可以看到所有旧数据

我曾尝试使用adb从数据库目录中手动删除
.db
文件,但当我再次运行应用程序时,仍然可以看到旧数据

我也尝试过进入应用程序设置并清除数据和缓存,但这似乎没有帮助

在我的代码中,我对数据库做任何“奇怪”的事情的唯一地方是,我在单击按钮时将数据库文件复制到一个新位置:

String pathToExternalStorage = Environment.getExternalStorageDirectory().toString();
File exportDir = new File(pathToExternalStorage, "/SensorData");
File subjectDataDir = new File(exportDir, "/subjects");

File data = Environment.getDataDirectory();
String currentDBPath = "//data//com.example.app//databases//" + DBHelper.DATABASE_NAME;
File currentDB = new File(data, currentDBPath);
File destDB = new File(exportDir, DBHelper.DATABASE_NAME);

FileChannel src = new FileInputStream(currentDB).getChannel();
FileChannel dst = new FileOutputStream(destDB).getChannel();
dst.transferFrom(src, 0, src.size());
src.close();
dst.close();
然后在新创建的文件上运行mediascanner,这样我就可以对它进行即时MTP访问

我怀疑这两个过程中的任何一个会导致这种情况发生

我眼前的问题是如何在没有root访问权限的情况下手动从手机中删除数据库

更大的问题是,是什么导致卸载过程无法删除数据库文件?新安装的应用程序版本(卸载后)如何仍能看到旧的数据库信息

我不知道该怎么开始弄明白

编辑:

这越来越奇怪了。这似乎只发生在Windows上。这就是我尝试的过程:

  • 从手机中删除/卸载应用程序
  • 在Windows上从android studio运行应用程序。问题:数据库仍然存在,应用程序可以看到所有旧数据(即使我卸载了应用程序)
  • 卸载应用程序
  • 在我的macbook上运行android studio中的应用程序。没问题!数据库是新的,未找到任何现有数据
  • 再次卸载应用程序
  • 在我的Windows计算机上再次测试。现在,数据库返回,应用程序会看到旧的数据库信息(来自步骤2!)。此时卸载并不能消除它

  • 所以我现在真的不知所措。为什么在Mac电脑上运行还可以?为什么在Mac上运行并清理完数据库后,会再次使用旧的Windows数据库?这不都是独立于操作系统的吗?

    如果存在这样的查询,您可以修改删除表的查询:

    DROP TABLE table_name IF EXISTS;
    
    然后

    CREATE TABLE table_name IF NOT EXISTS
    
    另外,如果您想从emulator中手动删除.db文件,或者您的设备要转到工具->Android->Android设备监视器:

    然后找到文件资源管理器:

    然后删除你的.db文件


    希望对你有帮助

    我知道这是一个很老的问题,但我也遇到了同样的问题,关闭了自动备份并修复了它(数据库被保存到云端并恢复)

    进入您的清单,并在应用程序添加下

    android:allowBackup="false"
    

    希望这能帮助任何有此问题的人。

    在应用程序中,您可以检查表是否存在。您可以删除该表并创建一个新的oneWow。这真奇怪!您是否在数据库中设置了一些特殊的内容,因为默认情况下,卸载应用程序时,数据库也会被删除。我的数据库中没有什么特别的内容。只有两个表,一个表有一个外键,这和我目前在DBHelper
    onUpgrade
    方法中使用的
    DROP table table\u name一样特殊。在我的助手中是否有其他地方我应该放置该代码?此外,device monitor方法不适用于非root的物理设备。因此,我猜您必须执行创建查询,如“DROP TABLE_name;create TABLE_name”,并查看它是否运行。我认为问题实际上比简单地以编程方式擦除数据库更大。请参阅上面的编辑没有设备监视器Singleton的答案在我升级到Kotlin的应用程序测试中是正确的。卸载应用程序后,更改为FALSE并删除数据库。只需确保在发布应用程序之前将其重新启用为true。