如何通过编程从Android中删除SQLite数据库

160
我想在程序中从Android文件系统中删除数据库文件。我可以编写一个启动adb的shell脚本,然后在Android空间中运行一个shell脚本来执行数据库删除吗?我能在JUnit测试用例内通过system()函数调用实现这个操作吗?
如何在Android中删除整个数据库?我需要完全删除数据库以便测试数据库创建。我可以删除表,但这是不够的。这是在模拟器中而不是在手机上。
13个回答

436

一旦你有了Context并且知道数据库的名称,使用以下代码:

context.deleteDatabase(DATABASE_NAME);

运行此行代码后,数据库应该被删除。


16
在删除之前,请确保关闭所有数据库连接,否则您将不得不重新启动应用程序。 - Ifrit

15

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

我尝试过:file.delete();,但它会破坏SQLiteOpenHelper。

谢谢。

不用担心! 我后来意识到您正在使用Context.deleteDatabase()。Context的这个方法很好用,而且还可以删除日志文件。对我有用。

另外,我发现在执行删除之前需要调用SQLiteOpenHelper.close(),这样我才能使用LoaderManager重新创建它。


12

只需要在你的 shell 中输入以下命令:

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

我收到了“rm failed for mydatabase.db, Permission denied”这个消息。这是否需要手机取得ROOT权限才能正常运行?还是有办法指定权限?或者只能在模拟器上运行? - PeteH
2
@PeteH 在模拟器上您不需要权限,但是对于真实设备,您需要获取root权限。 - Barmaley
12
这需要获取 root 权限,而且不能通过编程自动化执行 - Zoe stands with Ukraine
对我来说,这并不需要任何特殊的设置。我的意思是,当然,我自动登录为root,但一切都正常工作 :) - vlad-ardelean
好的,我在这里。root@generic_x86:/data/data/com.dslomer64.servyhelperton/databases #。除了删除、复制和其他操作之外,难道没有一个 dirlist files这个目录/文件夹里到底有什么 的命令吗? - DSlomer64
ls 命令列出当前文件夹中的文件。 - DSlomer64

12

尝试:

this.deleteDatabase(path); 
或者
context.deleteDatabase(path);

9
context.deleteDatabase("database_name.db");

这可能对某些人有所帮助。必须提及文件扩展名,否则将无法运行。

6

同时在Eclipse中,您可以使用DDMS,这使得操作变得非常简单。

只需确保您的模拟器正在运行,然后切换到Eclipse中的DDMS透视图。您将完全访问文件浏览器,从而可以轻松地进入并删除整个数据库。


1
这个能在实际手机设备上运行吗?我在DDMS模式下查看data文件夹时没有看到任何子文件夹。 - sammiwei
1
但是这个问题是关于以编程方式删除数据库的吗? - Simon

4

当所有连接都关闭时,context.deleteDatabase(DATABASE_NAME)将删除数据库。如果您正在维护用于处理数据库帮助程序的单例实例,则可以轻松关闭已打开的连接。

如果直接实例化多个数据库帮助程序并在多个地方使用它,则即使某些连接处于打开状态,deleteDatabase + killProcess也会完成工作。如果应用场景没有重新启动应用程序的问题,则可以使用此方法。


4

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

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


2

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

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

1
如果您要删除表格数据库,可以采用以下方法:
1- 删除表格 - 这意味着保留数据库,但清除表格中的数据。
    * Just in DataHelper class add


SQLiteDatabase db = this.getWritableDatabase();
db.execSQL("delete from " + TABLE_NAME);

2- 删除数据库 - 这意味着清除所有记录,但保留文件名

在活动中

  myDb = new DbHelper(this);
  myDb.close();
  myDb.delAll(getApplicationContext());
  recreate();

在DataHelper类中添加
public void delAll(Context context) {

        context.deleteDatabase(DB_NAME);
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接