在Android中删除整个数据库onUpgrade?

时间:2014-09-01 19:03:42

标签: android database sqlite android-sqlite

如果调用onUpgrade,我正在尝试完全删除数据库。根据这个问题:How to delete SQLite database from Android programmatically我可以调用context.deleteDatabase(String dbName),但我无法在onUpgrade方法中找到上下文。在onUpgrade中有一个传入的db对象,我看到你可以使用db.deleteDatabase()方法,但它需要一个文件。我没有db文件。有没有办法db.deleteSelf或类似的东西?我知道我可以删除表而不是完全删除数据库,但我的数据库结构已经完全改变了,我宁愿再次调用deleteDb();然后调用onCreate(db);

3 个答案:

答案 0 :(得分:5)

  

如果调用onUpgrade,我试图完全删除数据库。

请记住,消除所有用户的数据可能会让用户非常胡思乱想,就像在Play商店中的一星评级一样 - 级别暴躁。

此外,你想要的是相当危险的。您可能搞砸了架构版本元数据。即使假设您尝试做的事情一般都是明智的,我建议您只需在execSQL()上调用SQLiteDatabase来为您创建的每个表执行DROP TABLE语句(加{ {1}}等。)。

  

我可以调用context.deleteDatabase(String dbName),但是我无法在onUpgrade方法中找到上下文

您的DROP INDEX子类在其构造函数中传递SQLiteOpenHelper。虽然这不是通过getter方法公开的,但您可以将Context自己保留在数据成员中。

  

我知道我可以删除表而不是完全删除数据库,但我的数据库结构完全改变了,我宁愿只调用deleteDb();然后onCreate(db);试。

除了调用Context不会创建您的数据库。您将删除该数据库。因此,除非您自己创建一个空数据库文件,否则onCreate()将崩溃。在创建数据库时调用onCreate();它不是"创建一个数据库"。

此外,如果此应用程序仍在开发中,只需在再次运行之前卸载该应用程序,这将清除数据库(假设它存储在典型位置)。

答案 1 :(得分:1)

当您不关心旧数据时,实际上 旧数据库并不需要来创建新数据。 只需为新数据库提供一个不同的名称,它就会正常创建。 您可以随时删除旧的数据库文件(即,在启动主活动时,当您有Context时),并且在访问新数据库之前或之后不需要关心这是否发生

答案 2 :(得分:0)

所以我猜你的数据库类扩展了SQLiteOpenHelper,并且通过这个类型SQLiteOpenHelper(context:Context,name:String,factory:CursorFactory,version:int)的默认构造函数是必需的。这基本上意味着您在创建实例时需要将Context 传递给Database-Class。这是将上下文引用保存到局部变量的选项:

public class DatabaseHelper extends SQLiteOpenHelper {

    private Context mCtx;

    public DatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
        this.mCtx = context;
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i2) {
        mCtx.deleteDatabase("DB_NAME")
    }
}