Android SQLite无法升级数据库

时间:2011-06-29 20:54:37

标签: android

每次手机重启时都会调用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实例,如果它不存在,但他们无法从工厂获得上下文。所以他们所做的就是从其中一个活动中调用initialize方法。因此,通过将这些内容移动到构造函数中并删除初始化方法,一切正常。我注意到,初始化方法是从多个地方调用的。如果我理解正确,那么调用getWritableDatabase的次数并不重要,因为数据库是单个正确的吗?

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

Class Store {  公共存储(上下文上下文){       dbHelper = new DatabaseHelper(context);       db = dbHelper.getWritableDatabase();   } }

1 个答案:

答案 0 :(得分:0)

改变这个:

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

对此:

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

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