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