web-dev-qa-db-fra.com

Supprimer toutes les tables de la base de données sqlite

J'ai fait beaucoup de recherches et n'ai pas pu trouver une méthode appropriée pour supprimer toutes les tables d'une base de données SQLite. Enfin, j'ai fait un code pour obtenir tous les noms de table de la base de données et j'ai essayé de supprimer les tables en utilisant les noms de table récupérés un par un. Cela n'a pas fonctionné aussi bien.

Veuillez me suggérer une méthode pour supprimer toutes les tables de la base de données.

Voici le code que j'ai utilisé:

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

la fonction deleteall() est appelée sur le clic du bouton dont le code est donné comme ci-dessous:

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

Utilisation 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);
}
21
Tim Biegeleisen

réponse de Tim Biegeleisen a presque fonctionné pour moi, mais parce que j'utilisais AUTOINCREMENT clés primaires dans mes tables, il y avait une table appelée sqlite_sequence. SQLite plantait lorsque la routine tentait de supprimer cette table. Je n'ai pas pu saisir l'exception non plus. En regardant https://www.sqlite.org/fileformat.html#internal_schema_objects , j'ai appris qu'il pouvait y avoir plusieurs de ces schéma interne tables que je ne devrais pas ' t tomber. La documentation indique que ces tables ont des noms commençant par sqlite _ j'ai donc écrit cette méthode

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

supprimez la base de données au lieu de supprimer les tables, puis créez-en de nouveau avec le même nom si vous en avez besoin. utilisez le code suivant

context.deleteDatabase(DATABASE_NAME); 
          or
context.deleteDatabase(path);
1
Ganesh Karewad

Pour moi, la solution de travail est:

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