【发布时间】:2015-09-12 20:14:16
【问题描述】:
我正在尝试升级我的数据库,一切都很好,但 user_version 不会升级,但每次我启动应用程序时。它将转到 onUpgrade 并一次又一次地执行此升级操作。
onUpgrade database Android version number not increasing这里也有类似的问题,但他没有找到答案,所以我决定再问一次,如何增加和保存db版本?
我尝试使用setVersion,使用PRAGMA,将其设置在 onUpgrade() 之外和内部以及我能想象到的所有内容,但它不会自行增加,我的数据库是 14MiB,所以我买不起像上面问题中的 TS 一样,再复制一个到资产。
这是我的 onUpgrade() 代码,我在这里将以前 DB 的数据导出到 XML,删除表,创建新表并将数据从 xml 导入新表。
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (oldVersion == 1) {
cImportExport cImpExp = new cImportExport(db, cbActivity.MY_FILES_DIR + File.separator + "export.xml", oldVersion);
cImpExp.Export();
db.execSQL("DROP TABLE IF EXISTS " + "1");
db.execSQL("DROP TABLE IF EXISTS " + "2");
onCreate(db);
cImpExp.Import();
}
}
UPD
我发现,打开数据库并将其分配给变量后,版本成功递增:
ps_dbHelper = new _DBHelper(this);
try {
ps_db = ps_dbHelper.getWritableDatabase();
} catch (SQLiteCantOpenDatabaseException ex) {
alert(getString(R.string.db_not_found));
onCreate(null);
}
int ver = ps_db.getVersion(); //IT'S = 2, AS IT SHOULD BE
唯一的问题是为什么数据库在关闭后不会保存这个?我尝试显式调用ps_db 和ps_dbHelper 的.close 方法来检查它,但这没关系,在我启动应用程序后,它会通过oldVersion=1 进行onUpgrade ..
UPD 2
cImportExport 初始化代码:
public class cImportExport {
private String mXmlFilePath = cbActivity.MY_FILES_DIR + File.separator + "exported.xml";
private int mDbVersion = 0;
private SQLiteDatabase mDataBase;
public cImportExport(SQLiteDatabase db, String destXml, Integer dbVersion) {
this.mDataBase = db;
this.mXmlFilePath = destXml;
this.mDbVersion = dbVersion;
}
public boolean Export() {
cDbExport dbDump = new cDbExport(mDataBase, mXmlFilePath, mDbVersion);
dbDump.exportData();
return true;
}
...
cDbExport 初始化代码:
class cDbExport {
private String mDestXmlFilename;
private SQLiteDatabase mDb;
private Exporter mExporter;
private int mDbVersion = 0;
public cDbExport(SQLiteDatabase db, String destXml, Integer dbVersion) {
mDb = db;
mDestXmlFilename = destXml;
mDbVersion = dbVersion;
...
【问题讨论】:
-
user_version是什么意思?另外,你的表名真的是“1”和“2”吗? -
在 sqlite 文档中,该字段被描述为“user_version”,他们说sqlite 本身也使用了一些“schema_version”。不,我的表不是那样命名的))
-
在
onUpgrade()成功返回后,版本由SQLiteOpenHelper自动设置。显然,您的某些代码会干扰这一点。 -
不,一定是你没有显示的代码。导出器/导入器是否总是使用
db参数,还是有一些代码使用自己的连接? -
onUpgrade()显示的代码是实际代码吗?你有什么改变吗?