【问题标题】:android onUpgrade, version won't upgradeandroid onUpgrade,版本不会升级
【发布时间】: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() 显示的代码是实际代码吗?你有什么改变吗?

标签: android sqlite


【解决方案1】:

你不应该打电话给setVersion

升级版本的正确方法是更改​​SQLiteOpenHelper的构造函数中的参数

MyDatabaseHelper(Context context) {
   super(context, "databasename", null, <this is the version>); 
}

super 调用中的最后一个参数是您的数据库的版本

【讨论】:

  • stackoverflow.com/questions/11687473/… 看看这个,你有类似的 DatabaseHelper 访问同一个数据库吗?
  • 我已经使用了这样的构造函数,而且我没有多次实例化我的数据库和数据库助手,这个答案和这个链接没有任何用处。
【解决方案2】:

我发现有一些功能会在每次应用启动时复制DB,所以问题解决了。

【讨论】:

    猜你喜欢
    • 2014-01-14
    • 1970-01-01
    • 2018-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-20
    相关资源
    最近更新 更多