2016-07-30 16 views
9

Tôi đã thực hiện rất nhiều nghiên cứu và không thể tìm thấy một phương pháp phù hợp để xóa tất cả các bảng trong cơ sở dữ liệu SQLite. Cuối cùng, tôi đã làm một mã để có được tất cả các tên bảng từ cơ sở dữ liệu và Tôi đã cố gắng xóa các bảng bằng cách sử dụng tên bảng đã truy xuất từng cái một. Nó cũng không hoạt động.Xóa tất cả các bảng khỏi cơ sở dữ liệu sqlite

Vui lòng đề xuất cho tôi một phương pháp xóa tất cả các bảng khỏi cơ sở dữ liệu.

Đây là mã mà tôi sử dụng:

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

chức năng deleteall() được gọi vào nút nhấp chuột whos đang được đưa ra như sau:

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

Bạn có muốn _remove_ tất cả các bảng từ cơ sở dữ liệu, hoặc chỉ xóa tất cả dữ liệu trong các bảng? –

+1

Bạn không thể xóa toàn bộ tập tin cơ sở dữ liệu? http://stackoverflow.com/questions/4406067/how-to-delete-sqlite-database-from-android-programmatically?rq=1 – Thilo

+0

@TimBiegeleisen: Tôi muốn xóa tất cả các bảng khỏi cơ sở dữ liệu, không chỉ xóa dữ liệu trong bảng.Vui lòng đề xuất cho tôi một phương pháp để xóa tất cả các bảng. –

Trả lời

13

Sử dụng 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); 
} 
+0

Điều đó đã hiệu quả! Cảm ơn một tấn! :) –

0

xóa cơ sở dữ liệu thay vì xóa bảng và sau đó tạo mới với cùng tên nếu bạn cần. sử dụng đoạn mã sau câu trả lời

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

Tim Biegeleisen và gần như đã làm việc cho tôi, nhưng vì tôi đã sử dụng AUTOINCREMENT khóa chính trong bảng của tôi, đã có một bảng gọi là sqlite_sequence. SQLite sẽ sụp đổ khi các thói quen cố gắng để thả bảng đó. Tôi cũng không thể bắt được ngoại lệ. Nhìn vào https://www.sqlite.org/fileformat.html#internal_schema_objects, tôi đã học được rằng có thể có một số trong số lược đồ nội bộ bảng mà tôi không muốn bỏ. Các tài liệu nói rằng bất kỳ của các bảng đã tên bắt đầu bằng sqlite_ vì vậy tôi đã viết phương pháp này

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

Đối với tôi, giải pháp làm việc là:

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()); 
    } 
Các vấn đề liên quan