12

更新应用程序版本后,我在上传的应用程序中找不到此类表“table_name”。我在测试后出来了我只有在将旧版本的应用程序升级到新版本的应用程序后才会遇到这个问题

我实施了什么

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

step 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 链接2 链接 3链接4的解决方案

为什么我无法测试它

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

问题:

1) 如何在 Play 商店更新新版本之前测试 db upgrade?

2)仅当您仅从 Play 商店更新版本时才会调用它?

请帮我解决这个问题。

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

4

4 回答 4

5

存储在 db 中的 db 版本。只需创建一个比 DbHelper 版本旧的数据库(db_old)。使用 DbHelper 连接到 db_old,您的 onUpgrade 方法将被调用。

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

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

于 2013-10-08T13:47:21.293 回答
3

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

我让它工作了!在 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();
          }
        }

公共无效 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 数据库 - o​​ldVersion - newVersion

希望这对未来的开发人员有所帮助!

于 2013-10-09T14:31:06.913 回答
1

如何在不从 Android 的 Play 商店下载新版本应用程序的情况下测试升级 sqlite 数据库

1) 如何在 Play 商店更新新版本之前测试 db upgrade?

我从这里下载了用于 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 数据库并检查您对表所做的更改是否存在

于 2013-10-08T13:41:39.413 回答
1

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

于 2013-10-08T13:45:07.483 回答