如何以编程方式从 Android 中删除 SQLite 数据库

Posted

技术标签:

【中文标题】如何以编程方式从 Android 中删除 SQLite 数据库【英文标题】:How to delete SQLite database from Android programmatically 【发布时间】:2011-05-23 07:22:30 【问题描述】:

我想以编程方式从android file system 中删除数据库文件?我可以让一个 shell 脚本启动 adb,然后在 Android 空间中运行一个 shell 脚本来删除数据库吗?我可以在JUnit 测试用例(通过system() 调用)中完成这项工作吗?

如何在 Android 中删除整个数据库?我需要让整个事情消失,这样我就可以测试数据库的创建。我可以删除表格,但这还不够。这是在模拟器中,而不是在手机上。

【问题讨论】:

【参考方案1】:

一旦你有你的上下文并知道数据库的名称,使用:

context.deleteDatabase(DATABASE_NAME);

当这条线运行时,数据库应该被删除。

【讨论】:

确保在删除之前关闭所有数据库连接。否则,您必须重新启动应用程序。【参考方案2】:

API 16 中添加了 SQLiteDatabase.deleteDatabase(File file) 静态方法。如果你想编写支持旧设备的应用程序,你该怎么做?

我试过了:file.delete();

但它搞砸了 SQLiteOpenHelper。

谢谢。

没关系!我后来意识到您正在使用 Context.deleteDatabase()。 Context one 效果很好,也可以删除日志。对我有用。

另外,我发现我需要在删除之前调用 SQLiteOpenHelp.close(),这样我就可以使用 LoaderManager 重新创建它。

【讨论】:

【参考方案3】:

只需在 shell 中输入即可:

adb shell
cd /data/data
cd <your.application.java.package>
cd databases
su rm <your db name>.db

【讨论】:

我收到消息“mydatabase.db 的 rm 失败,权限被拒绝”。你必须有一个扎根的电话才能工作吗?或者有没有办法指定权限?还是只能在模拟器上运行? @PeteH 在模拟器上你不需要权限,但对于真正的设备你需要root 这需要 root 并且不是以编程方式 对我来说这不需要任何特殊设置。我的意思是,我是自动以 root 身份登录的,但一切正常 :) 好的,我来了。 root@generic_x86:/data/data/com.dslomer64.servyhelperton/databases #。除了删除、复制等,难道没有dirlist fileswhat the heck is in this directory/folder命令吗?【参考方案4】:

试试:

this.deleteDatabase(path); 

context.deleteDatabase(path);

【讨论】:

【参考方案5】:
context.deleteDatabase("database_name.db");

这可能对某人有所帮助。您必须提及扩展名,否则它将无法正常工作。

【讨论】:

【参考方案6】:

您也可以在 Eclipse 中使用 DDMS,这非常容易。

只需确保您的模拟器正在运行,然后在 Eclipse 中切换到 DDMS 透视图。您将拥有对文件资源管理器的完全访问权限,这将允许您进入并轻松删除整个数据库。

【讨论】:

这是否适用于实际的电话设备?在 DDMS 模式下查看时,我看不到数据文件夹下的任何子文件夹。 但是这个问题是关于以编程方式删除数据库的?【参考方案7】:

context.deleteDatabase(DATABASE_NAME);只有当所有连接都关闭时才会删除数据库。如果您正在维护单例实例来处理您的数据库助手 - 很容易关闭打开的连接。

如果通过直接实例化在多个地方使用databasehelper,即使某些连接打开,deleteDatabase + killProcess 也会完成这项工作。如果应用场景重启应用没有任何问题,可以使用这个。

【讨论】:

【参考方案8】:

卸载应用时删除旧数据库。

AndroidManifest.xml 的应用程序标签中设置 android:allowBackup="false" 解决了这个问题。似乎出于某种奇怪的原因,每次我部署应用程序时,Android 操作系统都会从备份中恢复。

【讨论】:

【参考方案9】:

您可以创建一个当前数据库路径的文件对象,然后像我们从文件夹中删除文件一样删除它

    File data = Environment.getDataDirectory();
    String currentDBPath = "/data/com.example.demo/databases/" + DATABASE_NAME;
    File currentDB = new File(data, currentDBPath);
    boolean deleted = SQLiteDatabase.deleteDatabase(currentDB);

【讨论】:

【参考方案10】:

我使用了Android数据库删除方法,数据库删除成功

public bool DeleteDatabase()
        
            var dbName = "TenderDb.db";
            var documentDirectoryPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
            var path = Path.Combine(documentDirectoryPath, dbName);
            return Android.Database.Sqlite.SQLiteDatabase.DeleteDatabase(new Java.IO.File(path));
        

【讨论】:

【参考方案11】:

在我更改 assets 中的数据库结构后,我已使用以下内容在设备上“格式化”数据库。当我希望再次从资产中读取数据库时,我只需取消注释 MainActivity 中的行。这将重置设备数据库值和结构以与资产文件夹中的专注数据库相匹配。

    //database initialization. Uncomment to clear the database
    //deleteDatabase("questions.db");

接下来,我将实现一个运行 deleteDatabase 的按钮,以便用户可以在游戏中重置其进度。

【讨论】:

【参考方案12】:

从应用程序管理器中,您可以删除整个应用程序的数据。或者只是它自己的数据。这包括数据库。

    导航至设置。您可以通过以下方式进入设置菜单 您的应用程序菜单,或者在大多数手机上,通过下拉通知 抽屉并在那里点击一个按钮。

    选择应用程序子菜单。在某些手机上,此菜单将包含 名称略有不同,例如 Application Manager。

    向右滑动 所有应用列表。忽略正在运行和下载的应用列表。 您想要所有应用列表。

    选择您要禁用的应用程序。将出现一个属性屏幕,其中 左上角有一个强制停止按钮和一个按钮 在右上角禁用或卸载更新。

    删除数据。

【讨论】:

OP 以编程方式表示。转到设置并点击按钮不是以编程方式。 @mmking 我知道这一点。只是这是删除数据库而不是表和内容的最简单方法。他说他需要它来测试数据库的创建,这就是这样做的。我一直在寻找同样的东西并为此安定下来。

以上是关于如何以编程方式从 Android 中删除 SQLite 数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式从 Android 的默认应用列表中删除应用?

如何在android中以编程方式从收件箱中删除所有短信?

如何以编程方式在android 10中恢复已删除的联系人

Android:以编程方式从剪贴板中删除单个项目

在 Android 中以编程方式从启动器中删除应用程序

是否可以以编程方式从 Android 中删除记住的 Wifi Direct 组?