在sqliteopenhelper中没有被求职
方法onupgrade
即使它获得的数据库版本大于当前版本,也不会被调用。
我使用以下命令验证了DB版本,目前是 6 。
sqlite> PRAGMA user_version;
6
在构造函数中,我要传递以下(版本7 ),
super(context, DB_NAME, null, 7);
注意:我的类dbhelper扩展了sqliteopenhelper,上面的行中存在于dbhelper的构造函数中。
sqlite版本:3.32.3
当我传递新的(更大的)DB版本时,我希望可以调用Onupgrade。但是从来没有称呼upgrade。我想念其他东西吗?
更新1:
dbhelper.class
class DBHelper extends SQLiteOpenHelper
{
@Inject
public DBHelper(final Context context)
{
this(context, DBContracts.DATABASE_FILE_NAME);
}
DBHelper(final Context context, final String databaseFileName)
{
super(context, databaseFileName, null, DBContracts.DATABASE_VERSION);
Logger.i("APPTAG", "DBHelper constructor");
Logger.i("APPTAG", "DATABASE_VERSION : " + DBContracts.DATABASE_VERSION);
}
@Override
public void onCreate(final SQLiteDatabase db)
{
Logger.i("APPTAG", "onCreate");
// create scripts
}
@Override
public void onUpgrade(final SQLiteDatabase db, final int oldVersion, final int newVersion)
{
Logger.i("APPTAG", "onUpgrade");
Logger.i("APPTAG", "oldVersion: " + oldVersion);
Logger.i("APPTAG", "newVersion: " + newVersion);
// upgrade scripts
}
@Override
public void onConfigure(final SQLiteDatabase db)
{
Logger.i("APPTAG", "onConfigure");
Logger.i("APPTAG", "DB version: " + db.getVersion());
try {
Logger.i("APPTAG", "DB path: " + db.getPath());
int version = ((Long) DatabaseUtils.longForQuery(db, "PRAGMA user_version;", null)).intValue();
Logger.i("APPTAG", "onConfigure version: " + version);
} catch (Exception e) {
Logger.e("APPTAG", "Error" + e, e);
}
super.onConfigure(db);
}
@Override
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Logger.i("APPTAG", "onDowngrade");
Logger.i("APPTAG", "oldVersion: " + oldVersion);
Logger.i("APPTAG", "newVersion: " + newVersion);
super.onDowngrade(db, oldVersion, newVersion);
}
@Override
public void onOpen(SQLiteDatabase db) {
Logger.i("APPTAG", "onOpen");
Logger.i("APPTAG", "DB version: " + db.getVersion());
super.onOpen(db);
}
}
,这是我看到的日志,
05-04 07:47:33.021 4295 4295 I APPTAG: DBHelper constructor
05-04 07:47:33.021 4295 4295 I APPTAG: DATABASE_VERSION : 7
05-04 07:47:33.023 4295 4295 I APPTAG: UpdatesDB constructor
05-04 07:47:33.023 4295 4295 I APPTAG: SQLiteDatabaseWrapperFactory create
05-04 07:47:33.029 4295 4295 I APPTAG: onConfigure
05-04 07:47:33.030 4295 4295 I APPTAG: DB version: 7
05-04 07:47:33.030 4295 4295 I APPTAG: DB path: /data/user/0/<application-name>/databases/updates.db
05-04 07:47:33.030 4295 4295 I APPTAG: onConfigure version: 7
05-04 07:47:33.031 4295 4295 I APPTAG: onOpen
05-04 07:47:33.031 4295 4295 I APPTAG: DB version: 7
如果我直接在数据库上执行此命令pragma user_version;
,我将其版本为6。但是,当我尝试使用代码(如在configure中)时,它给了我7。因此,它会根据此代码。
谁能帮助我理解为什么我通过代码获取DB版本为7?
澄清:
- 我正在调用
getWritabledatabase()
获取DB实例。 dbontracts.database_version
设置为7
The method onUpgrade
is not getting called even if it gets the DB version greater than the current.
I verified the DB version using the following command and it is 6 currently.
sqlite> PRAGMA user_version;
6
In the constructor, I'm passing the following (version 7),
super(context, DB_NAME, null, 7);
Note: My class DBHelper extends SQLiteOpenHelper and the above line is present in the constructor of DBHelper.
SQLite version: 3.32.3
As I'm passing the new (greater) DB version, I expect the onUpgrade to be called. But the onUpgrade is never called. Am I missing any other thing?
UPDATE 1:
DBHelper.class
class DBHelper extends SQLiteOpenHelper
{
@Inject
public DBHelper(final Context context)
{
this(context, DBContracts.DATABASE_FILE_NAME);
}
DBHelper(final Context context, final String databaseFileName)
{
super(context, databaseFileName, null, DBContracts.DATABASE_VERSION);
Logger.i("APPTAG", "DBHelper constructor");
Logger.i("APPTAG", "DATABASE_VERSION : " + DBContracts.DATABASE_VERSION);
}
@Override
public void onCreate(final SQLiteDatabase db)
{
Logger.i("APPTAG", "onCreate");
// create scripts
}
@Override
public void onUpgrade(final SQLiteDatabase db, final int oldVersion, final int newVersion)
{
Logger.i("APPTAG", "onUpgrade");
Logger.i("APPTAG", "oldVersion: " + oldVersion);
Logger.i("APPTAG", "newVersion: " + newVersion);
// upgrade scripts
}
@Override
public void onConfigure(final SQLiteDatabase db)
{
Logger.i("APPTAG", "onConfigure");
Logger.i("APPTAG", "DB version: " + db.getVersion());
try {
Logger.i("APPTAG", "DB path: " + db.getPath());
int version = ((Long) DatabaseUtils.longForQuery(db, "PRAGMA user_version;", null)).intValue();
Logger.i("APPTAG", "onConfigure version: " + version);
} catch (Exception e) {
Logger.e("APPTAG", "Error" + e, e);
}
super.onConfigure(db);
}
@Override
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Logger.i("APPTAG", "onDowngrade");
Logger.i("APPTAG", "oldVersion: " + oldVersion);
Logger.i("APPTAG", "newVersion: " + newVersion);
super.onDowngrade(db, oldVersion, newVersion);
}
@Override
public void onOpen(SQLiteDatabase db) {
Logger.i("APPTAG", "onOpen");
Logger.i("APPTAG", "DB version: " + db.getVersion());
super.onOpen(db);
}
}
And this is the log I see,
05-04 07:47:33.021 4295 4295 I APPTAG: DBHelper constructor
05-04 07:47:33.021 4295 4295 I APPTAG: DATABASE_VERSION : 7
05-04 07:47:33.023 4295 4295 I APPTAG: UpdatesDB constructor
05-04 07:47:33.023 4295 4295 I APPTAG: SQLiteDatabaseWrapperFactory create
05-04 07:47:33.029 4295 4295 I APPTAG: onConfigure
05-04 07:47:33.030 4295 4295 I APPTAG: DB version: 7
05-04 07:47:33.030 4295 4295 I APPTAG: DB path: /data/user/0/<application-name>/databases/updates.db
05-04 07:47:33.030 4295 4295 I APPTAG: onConfigure version: 7
05-04 07:47:33.031 4295 4295 I APPTAG: onOpen
05-04 07:47:33.031 4295 4295 I APPTAG: DB version: 7
Interestingly, if I execute this command PRAGMA user_version;
directly on the database, I get the version as 6. But when I tried through the code (as in onConfigure), it gives me 7. Due to this, it skips the onUpgrade method as per this code.
Could anyone help me understand why the db version is getting reported as 7 when I fetch it through code?
Clarifications:
- I'm calling
getWritableDatabase()
to get the db instance. DBContracts.DATABASE_VERSION
is set to 7
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我相信您的问题在于您的问题中,或者可能是滥用拳头的构造函数(也许会评论一下,看看您的票价)。
考虑此修改(主要参见代码的末尾,而IE添加
getDatabaseversion
方法),以在打开数据库和其他次要更改之前,请包括检索版本号,以便我的便利: -然后活动中的以下代码: -
应用程序两次运行: -
结果是: -
然后: -
第三次运行,没有更改任何内容(因此已经在版本7处的DB): -
I believe that your issue lies outside of the code in your question, or perhaps it is a misuse the fist constructor (perhaps comment that out and see how you fare).
Consider this modification (primarily see the end of the code and the i.e. the added
getDatabaseVersion
method), to include retrieval of the version number prior to to opening the database and other minor changes for my convenience :-Then the following code in an activity:-
The App was run twice:-
The results being :-
Then :-
A third run, without changing anything (so db already at version 7) then :-