【问题标题】:Android SQLite unable to upgrade databaseAndroid SQLite 无法升级数据库
【发布时间】:2011-07-01 02:21:12
【问题描述】:

每次手机重启时都会调用 onUpgrade 方法,我可以看到 onUpgrade 中的 oldVersion 参数永远不会被调用。我曾尝试卸载该应用程序,但没有成功。奇怪的是oldVersion总是6。或者每次手机重启时我的数据库都消失了还有其他原因吗?

private static final int DATABASE_VERSION = 7;

private static class DatabaseHelper extends SQLiteOpenHelper {
    /**
     * jdbc Constructor.
     * 
     * @param context
     */

    Context mContext;
    DatabaseHelper(Context context) {
      super(context, DATABASE_NAME, null, DATABASE_VERSION);
      mContext = context;

    }

    /**
     * @see android.database.sqlite.SQLiteOpenHelper#onCreate(android.database.sqlite.SQLiteDatabase)
     */
    public void onCreate(SQLiteDatabase db) {
      LogToSD.write((getClass().toString() + " " + LogToSD.getMethodName(2)), "Enter");
      try {
        db.execSQL(DATABASE_CREATE_1);
        db.execSQL(DATABASE_CREATE_2);
        db.execSQL(DATABASE_CREATE_3);
        db.execSQL(DATABASE_CREATE_4);
        db.execSQL(DATABASE_CREATE_5);
      } catch (Exception e) {
        logger.error("Unable to query database", e);
      }
    }

    /**
     * @see android.database.sqlite.SQLiteOpenHelper#onUpgrade(android.database.sqlite.SQLiteDatabase,
     *      int, int)
     */
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
      LogToSD.write((getClass().toString() + " " + LogToSD.getMethodName(2)), "Enter");
      String version = "oldVersion " + Integer.toString(oldVersion) + " newVersion "
        + Integer.toString(newVersion);
      LogToSD.write((getClass().toString() + " " + LogToSD.getMethodName(2)), version);


      if (newVersion > oldVersion) {
        try {
          //DROP OLD
          db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE_1);
          db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE_2);
          db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE_3);
          db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE_4);
          db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE_5);
          //CREATE NEW
          onCreate(db);
        } catch (Exception e) {
          e.toString();
        }
      }

    }
  }

已解决 所以看起来他们在构造函数中什么也没做,而是把所有东西都移到了一个初始化方法中。

Class Store {
 public Store() {
    db = null;
    table = new HashMap<String, String>();
  }

 public void initialize(Context context) throws SQLException {
    if (db == null) {
      dbHelper = new DatabaseHelper(context);
      db = dbHelper.getWritableDatabase();
    }
  }
}

他们这样做是因为他们使用了一个工厂,如果它不存在,它只会创建一个 Store 实例,但他们无法从工厂获取上下文。所以他们所做的就是从其中一项活动中调用初始化方法。因此,通过将这些东西移入构造函数并删除初始化方法,一切正常。我注意到从不止一个地方调用了初始化方法。如果我理解正确,调用 getWritableDatabase 多少次都没关系,因为数据库是单例正确的?

所以我的问题是,即使这可能不是最佳做法,为什么这不起作用?

类商店{ 公共商店(上下文上下文){ dbHelper = 新数据库助手(上下文); db = dbHelper.getWritableDatabase(); } }

【问题讨论】:

    标签: android


    【解决方案1】:

    改变这个:

        } catch (Exception e) {
          e.toString();
        }
    

    到这里:

        } catch (Exception e) {
          logger.error("Unable to upgrade database", e);
        }
    

    打印的堆栈跟踪应该可以解释您的问题。如果没有,请在此处发布,我们会看看。 :-)

    【讨论】:

    • 它没有出现异常?
    • 你怎么知道的?您是否进行了我建议的更改并再次运行该应用程序?
    • 好吧,我想我已经解决了这个问题。它与调用 dbhelper 的类有关。我稍后会分享这个问题。谢谢
    • 会不会是一个数据库链接到一个databasehelper,然后通过创建另一个database helper,数据库丢失了?
    • 数据库与DATABASE_NAME 绑定,而不是SQLiteOpenHelper 的任何特定实例。但是,我对您的解决方案感到困惑。你是说onUpgrade 从未被调用过吗?
    猜你喜欢
    • 1970-01-01
    • 2013-06-20
    • 1970-01-01
    • 2016-06-02
    • 1970-01-01
    • 2012-10-14
    • 2014-09-25
    • 1970-01-01
    • 2018-07-12
    相关资源
    最近更新 更多