问题 如何在Android上的Play商店上传我的应用程序的新版本之前测试升级sqlite数据库


我发现在更新应用版本后,我上传的应用程序中没有找到“table_name”这样的表。我在测试后出来我只是在将旧版本的应用程序升级到新版本的应用程序之后才遇到此问题

我所实施的内容

我已经在onUpgrade()方法中完成了代码,并且还在构造函数中升级了db版本,但我无法在设备中对其进行测试。

步骤1)  将版本代码1增加到2

public databasehelper(Context context) {

        super(context, DATABASE_NAME, null, 2);
        this.myContext = context;
        try {
            createDataBase();
            openDataBase();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

第2步) 添加了新表 onUpgrade() 方法

@Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        Log.e("onUpgrade db", ">>>>called");
        switch (oldVersion) {
        case 1:
            db.execSQL(DATABASE_CREATE_notification_counter);
            Log.e("db version", ">>>"+oldVersion);
            // we want both updates, so no break statement here...
        case 2:
            Log.e("db version", ">>>"+oldVersion);
                  // I removed onCreate() method from here because new version will already have the new table
//          onCreate(db);
        }

    }

第3步) onCreate()方法用于新版本的数据库。

@Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(DATABASE_CREATE_notification_counter); 
        Log.d("oncreate db", ">>>>called");
    }

我有解决方案来升级数据库 链接1  LINK2  LINK3  LINK4

为什么我无法测试它

我们已经在Play商店上传了付费应用程序,所以我必须在模拟器或设备中测试数据库升级方法,使用两个不同的apk意味着旧版本和更新版本。 我已经在设备中第一次使用旧版本和新版本进行了测试(db更改了db中添加的新表)但是此时不会调用onUpgrade()方法。

题:

1)如何在更新新版本之前测试数据库升级   应用商店?

2)只有在从Play商店更新版本时才会调用   只要?

请帮我解决这个问题。

答案将不胜感激。提前致谢。


2905
2017-10-08 13:10


起源

你为什么不依次安装这两个版本?我无法理解这里遗漏的东西 - njzk2
@ njzk2其实我已经对我的代码进行了更改以升级数据库,所以我不能直接从eclipse安装我的旧版本,对于新版本我已经通过两种方式测试只需安装和签名apk但没有运气。 - Maulik
你没有以前版本的来源? - njzk2
@ njzk2对不起,这是我的错。我还通过直接在我的设备上安装了旧版本和更新版本的db来测试它。 - Maulik
那时我不明白你的问题 - njzk2


答案:


存储在db中的db版本。只需创建一个旧版本的db(db_old),而不是DbHelper。使用DbHelper连接到db_old,将调用onUpgrade方法。

您可以将现有数据库用作db_old,只需减少它的版本即可。要更改版本,您可以使用任何sqlite db编辑器。

如果不想为DbHelper编写测试并想要模拟应用程序升级,则可以使用 adb install -r 命令。 在这里阅读更多。


4
2017-10-08 13:47



谢谢你回答我的问题。能不能给我一些正确理解的例子来解释我? - Maulik
db只是一个包含数据的文件。数据的版本也存储在同一个文件中。如果要调用onUpgrade,则应使用sqlite编辑器打开当前的db文件并减少db版本。下次连接到db时,将调用OnUpgrade,您可以检查它是如何工作的。 - Leonidos
您还可以在DbHelper中增加db版本。并连接到您当前的数据库。应该调用OnUpgrade。 - Leonidos
您是指数据库设置字段中的模式版本还是用户版本? - Maulik
我的意思是在SQLiteOpenHelper构造函数中增加版本。此数字与db版本号(存储在db文件中)进行比较,如果它在onUpgrade上更大则将被调用。 - Leonidos


经过长时间搜索和测试我的应用程序,最后...

我搞定了!在createDataBase-class中缺少一行:

我刚刚在我的代码createDataBase()中添加了以下行

this.getWritableDatabase();

我们必须在创建数据库时授予编写数据库的权限,当我们从Play商店升级应用程序时,此权限将被授予编写数据库的权限。

成功打开后,数据库将被缓存,因此您可以调用   每次需要写入数据库时​​都会使用此方法。 (确保   在不再需要数据库时调用close()。)错误如   错误的权限或完整的磁盘可能会导致此方法失败,但是   如果问题得到解决,未来的尝试可能会成功。

数据库升级可能需要很长时间,您不应该调用此方法   从应用程序主线程,包括从   ContentProvider.onCreate()。

public void createDataBase() throws IOException 
        { boolean dbExist = checkDataBase(); 
          if (!dbExist) {
           this.getReadableDatabase();
            try {
                // ---If not created then copy the database---
                copyDataBase();
            } catch (IOException e) {
                throw new Error("Error copying database");
            }
          }
          else {
            /* This line: that has been solve my problem */
           this.getWritableDatabase();
          }
        }

public void openDataBase()抛出SQLException {

      // --- Open the database---         String myPath = path + DATABASE_NAME;
      myDataBase = SQLiteDatabase.openDatabase(myPath, null,
              SQLiteDatabase.OPEN_READWRITE); // you also have to add open_readwrite condition here
              /*onUpgrade(myDataBase, 1, 2);*/ // no need to call upgrade     here it will be called automatically

  }

打开数据库时必须提供读写条件。

此外,在创建类DataBaseHelper的新对象时调用onUpgrade(),但仅在数据库版本号不匹配时调用。所以这意味着没有必要“自己”调用onUpgrade。如果发布数据库的更新,只需将版本nr递增1并在onUpgrade()方法中应用更改。

我是从给定的链接得到的:

onUpgrade数据库 - oldVersion - newVersion

希望这将有助于未来的开发人员!


3
2017-10-09 14:31





如何测试升级sqlite数据库而无需从android中的Play商店下载新版本应用程序

1)如何在Play商店更新新版本之前测试数据库升级?

我从这里下载了eclipse的sqlite浏览器插件

http://sourceforge.net/projects/sqlitebrowser/

并查看本教程如何使用sqlite插件

http://www.coderzheaven.com/2011/04/18/sqlitemanager-plugin-for-eclipse/

只需从第一个链接复制jar并粘贴到名为plugin的eclipse安装文件夹中,然后重新启动eclipse

然后启动一个模拟器并从DDMS导航到您的包,您可以查看您的sqlite数据库并检查您对表所做的更改是否存在


1
2017-10-08 13:41



抱歉兄弟,我想你不能正确理解我的问题。我想在Play商店上传apk作为新版本的app之前测试我的新版本数据库。 - Maulik
是的,这就是我想告诉你的,在更改yiur数据库表之后和上传之前,使用sqlite浏览器检查你的新更改的数据库是否正常工作 - Maulik Sheth
我已经为Firfox提供了sqlite manager插件。我已经使用sqlite管理器进行了测试,但我的onupgrade()方法没有被调用,因此升级数据库后无法创建新表。 - Maulik
感谢为eclipse添加插件的链接。我用sqlite manager firefox插件测试了数据库。我已经解决了这个问题,请查看下面给出的答案。无论如何,谢谢你的答案。 - Maulik


您可以从Playstore以外的其他来源安装apk(如果在手机上启用了)。 通过电子邮件将其发送到手机或通过USB线复制apk的最简单方法。


1
2017-10-08 13:45