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

3

我正在尝试为我的应用程序提供一个选项,让用户清除所有数据并重新开始。我尝试了一些方法,但似乎都不起作用,因为数据仍然存在。以下是我的第一次尝试:

public void clearDatabase(Context context) {
        DatabaseHelper helper = new DatabaseHelper(context);
        SQLiteDatabase database = helper.getWritableDatabase();
        database.delete(Constants.TRANSACTION_TABLE, null, null); //erases everything in the table.
        database.delete(Constants.CUSTOMER_TABLE, null, null);
        database.delete(Constants.RETAILER_TABLE, null, null);

        database.close();
    }

这似乎有效,但是应用程序在重新启动时会崩溃。
然后我尝试从SQliteOpenHelper子类中使用此代码。
  public void resetDatabase() {
    SQLiteDatabase database = getWritableDatabase();
    database.execSQL("DROP TABLE IF EXISTS customer_table");
    database.execSQL("DROP TABLE IF EXISTS transaction_table");
    database.execSQL("DROP TABLE IF EXISTS retailer_table");
    database.execSQL(CREATE_CUSTOMER_TABLE);
    database.execSQL(CREATE_TRANSACTION_TABLE);
    database.execSQL(CREATE_RETAILER_TABLE);
    database.close();
}

这个问题并不会在重启后崩溃,但数据仍然存在。唯一有效的方法是通过编程更改版本号。但是,当我从IDE运行应用程序时,它将具有旧版本号,因为设备上的版本号高于代码中的版本号,导致应用程序无法启动。

我还能尝试什么?


你确定表名正确吗?尝试在不使用'IF EXISTS'的情况下执行execSQL,看看系统是否会抛出异常。 - rickyalbert
谢谢,我尝试了并添加了一些日志语句,确认表已被删除,但应用程序无法重新启动,崩溃并显示表不存在,我正在调查。 - Val Okafor
3个回答

6

最后这对我有用。

首先删除并创建数据库。

  public void resetDatabase() {
        SQLiteDatabase database = getWritableDatabase();
        database.execSQL("DROP TABLE IF EXISTS " + Constants.CUSTOMER_TABLE);
        database.execSQL("DROP TABLE IF EXISTS " + Constants.TRANSACTION_TABLE);
        database.execSQL("DROP TABLE IF EXISTS " + Constants.RETAILER_TABLE);
        database.execSQL(CREATE_CUSTOMER_TABLE);
        database.execSQL(CREATE_TRANSACTION_TABLE);
        database.execSQL(CREATE_RETAILER_TABLE);
        database.close();
    }

然后重启从这个问题中借用的应用程序如何以编程方式“重新启动”Android应用程序?

public static void resetApp() {
        sDatabase.resetDatabase(); 
        preferenceEditor.clear();
        preferenceEditor.commit();
        Intent mStartActivity = new Intent(sContext, MainActivity.class);
        int mPendingIntentId = 123456;
        PendingIntent mPendingIntent = PendingIntent.getActivity(sContext, mPendingIntentId,    mStartActivity, PendingIntent.FLAG_CANCEL_CURRENT);
        AlarmManager mgr = (AlarmManager)sContext.getSystemService(Context.ALARM_SERVICE);
        mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, mPendingIntent);
        System.exit(0);

    }

2

我认为最好、最简单的删除完整数据库文件的方法是 context.deleteDatabase(DATABASE_NAME);

但在此之前,您必须关闭所有数据库连接,否则您将不得不重新启动应用程序。 希望这能帮到您。


1
尝试这段代码。
    SQLiteDatabase db = dbHelper.getWritableDatabase(); 

    count = db.delete("table_name", selection, selectionArgs);

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