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


151

我想以Android file system编程方式删除数据库文件吗?我是否可以启动adbShell脚本,然后依次在Android空间中运行Shell脚本来删除数据库?我可以在JUnit测试用例中(通过system()电话)完成此操作吗?

如何在Android中删除整个数据库?我需要使整个过程消失,以便可以测试数据库的创建。我可以放桌子,但这还不够。这是在模拟器中,而不是在电话中。

Answers:


410

有了Context并知道数据库名称后,请使用:

context.deleteDatabase(DATABASE_NAME);

运行此行后,应删除数据库。


14
在删除之前,请确保关闭所有数据库连接。否则,您将不得不重新启动应用程序。
杰伊·索耶

简单而有用...谢谢!
Marco Espinoza

13

只需在shell中键入即可:

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

我收到消息“ mydatabase.db rm失败,权限被拒绝”。您必须拥有一部扎根电话才能正常工作吗?还是有一种方法可以指定权限?还是仅在模拟器上有效?
PeteH

2
@PeteH在模拟器上,您不需要权限,但对于真实设备,您需要植根
Barmaley Red Star

9
这需要root而不是通过编程
佐伊

对我来说,这不需要任何特殊的设置。我的意思是肯定的是,我已经自动以root用户身份登录,但是一切正常:)
vlad-ardelean

好我在这 root@generic_x86:/data/data/com.dslomer64.servyhelperton/databases #。除了删除,复制和其他操作以外,没有diror list files或or what the heck is in this directory/folder命令吗?
DSlomer64 '17

12

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

我试过了:file.delete();

但它搞砸了SQLiteOpenHelper。

谢谢。

没关系! 后来我意识到您正在使用Context .deleteDatabase()。Context 1很好用,也删除了日记。为我工作。

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


11

尝试:

this.deleteDatabase(path); 

要么

context.deleteDatabase(path);

6

同样,从Eclipse中,您可以使用DDMS,这使它非常容易。

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


1
这可用于实际的电话设备吗?在DDMS模式下查看时,我在数据文件夹下看不到任何子文件夹。
sammiwei

1
但是这个问题是关于以编程方式删除数据库吗?
西蒙(Simon)


3

context.deleteDatabase(DATABASE_NAME); 仅在所有连接均关闭的情况下才会删除数据库。如果您要维护用于处理数据库助手的单例实例,则很容易关闭打开的Connection。

如果通过直接实例化在多个位置使用databasehelper,则即使打开了某些连接,deleteDatabase + killProcess也可以完成该工作。如果应用程序场景在重新启动应用程序时没有任何问题,则可以使用此方法。


3

卸载应用程序时删除旧的Db。

AndroidManifest.xml的应用程序标签中设置android:allowBackup =“ false”可以解决此问题。似乎出于某种奇怪的原因,每次我部署应用程序时,Android OS都从备份中还原。


3

您可以创建当前数据库路径文件对象,然后在我们从文件夹中删除文件时将其删除

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

0

我使用了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));
        }

0

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

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

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


-2

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

  1. 导航到设置。您可以在应用程序菜单中打开设置菜单,或者在大多数手机上,通过下拉通知抽屉并点击那里的按钮进入设置菜单。

  2. 选择应用程序子菜单。在某些手机上,此菜单的名称会稍有不同,例如“应用程序管理器”。

  3. 向右滑动至所有应用程序列表。忽略正在运行和已下载应用程序的列表。您需要所有应用程序列表。

  4. 选择您要禁用的应用程序。出现一个属性屏幕,在左上角带有一个用于“强制停止”的按钮,在右上侧带有另一个用于“禁用”或“卸载”更新的按钮。

  5. 删除数据。


8
OP以编程方式表示。进入设置并按下按钮不是编程方式。
mmking

@mmking我知道这一点。只是这是删除数据库而不是表和内容的最简单方法。他说他需要它来测试数据库的创建,并且这样做。我一直在寻找相同的东西,并为此解决了。
f470071 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.