从sqlite数据库中删除所有表

我做了大量的研究,无法find合适的方法来删除SQLite数据库中的所有表。 最后,我做了一个代码来从数据库中获取所有的表名, 我试着用检索到的表名逐个删除表 。 它没有工作。

请build议我一个从数据库中删除所有表的方法。

这是我使用的代码:

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()在button上调用,点击whos代码如下:

 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(); }} 

Solutions Collecting From Web of "从sqlite数据库中删除所有表"

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

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(); } } 

对我来说,工作解决scheme是:

  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()); } 

删除数据库,而不是删除表,然后创build新的名称,如果你需要的话。 使用下面的代码

 context.deleteDatabase(DATABASE_NAME); or context.deleteDatabase(path);