从sqlite数据库中删除所有表

19

我已经做了很多研究,但是无法找到一个适合删除SQLite数据库中所有表的方法。最终,我编写了一段代码来从数据库中获取所有表名,并使用检索到的表名分别进行删除操作。但是,这也没有奏效。

请给我提供一种删除数据库中所有表的方法。

以下是我使用的代码:

public void deleteall(){
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor c = db.rawQuery("SELECT name FROM sqlite_master WHERE type='table'", null);
    do
    {
        db.delete(c.getString(0),null,null);
    }while (c.moveToNext());
}

当点击按钮时,会调用名为deleteall()的函数,其代码如下:

function deleteall() is called on button click whos code is given as below:

public void ButtonClick(View view)
{
    String Button_text;
    Button_text = ((Button) view).getText().toString();

    if(Button_text.equals("Delete Database"))
    {
        DatabaseHelper a = new DatabaseHelper(this);
        a.deleteall();
        Toast.makeText(getApplicationContext(), "Database Deleted Succesfully!", Toast.LENGTH_SHORT).show();
    }}

3
您想从数据库中“移除”所有表格,还是只删除表格中的所有数据? - Tim Biegeleisen
1
你不能只是删除整个数据库文件吗?https://dev59.com/tW855IYBdhLWcg3wViot?rq=1 - Thilo
@TimBiegeleisen:我想从数据库中删除所有表,而不仅仅是删除表中的数据。请建议一种方法来删除所有表。 - Tony Mathew
@TonyMathew 我在下面给了你一个答案,如果可以的话请告诉我它是否适用于你。 - Tim Biegeleisen
请查看此链接中的已接受答案。http://stackoverflow.com/questions/25641350/how-to-delete-all-tables-from-sqlite-in-android - Pravin Divraniya
4个回答

26

使用 DROP TABLE

// query to obtain the names of all tables in your database
Cursor c = db.rawQuery("SELECT name FROM sqlite_master WHERE type='table'", null);
List<String> tables = new ArrayList<>();

// iterate over the result set, adding every table name to a list
while (c.moveToNext()) {
    tables.add(c.getString(0));
}

// call DROP TABLE on every table name
for (String table : tables) {
    String dropQuery = "DROP TABLE IF EXISTS " + table;
    db.execSQL(dropQuery);
}

7

Tim Biegeleisen的回答对我来说几乎有效,但由于我在表中使用了AUTOINCREMENT主键,所以有一个名为sqlite_sequence的表。当程序尝试删除该表时,SQLite会崩溃。我也无法捕获异常。查看https://www.sqlite.org/fileformat.html#internal_schema_objects,我了解到可能有几个这些内部模式表不能删除。文档说任何这些表的名称都以sqlite_开头,因此我编写了这个方法:

private void dropAllUserTables(SQLiteDatabase db) {
    Cursor cursor = db.rawQuery("SELECT name FROM sqlite_master WHERE type='table'", null);
    //noinspection TryFinallyCanBeTryWithResources not available with API < 19
    try {
        List<String> tables = new ArrayList<>(cursor.getCount());

        while (cursor.moveToNext()) {
            tables.add(cursor.getString(0));
        }

        for (String table : tables) {
            if (table.startsWith("sqlite_")) {
                continue;
            }
            db.execSQL("DROP TABLE IF EXISTS " + table);
            Log.v(LOG_TAG, "Dropped table " + table);
        }
    } finally {
        cursor.close();
    }
}

2
如果需要,可以删除数据库而不是删除表并使用相同的名称创建新表。请使用以下代码:
context.deleteDatabase(DATABASE_NAME); 
          or
context.deleteDatabase(path);

2

对于我来说,可行的解决方案是:

    Cursor c = db.rawQuery(
            "SELECT name FROM sqlite_master WHERE type IS 'table'" +
                    " AND name NOT IN ('sqlite_master', 'sqlite_sequence')",
            null
    );
    if(c.moveToFirst()){
        do{
            db.execSQL("DROP TABLE " + c.getString(c.getColumnIndex("name")));
        }while(c.moveToNext());
    }

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