2011-06-29 174 views
0

每次手機重新啓動時都會調用onUpgrade方法,我可以看到onUpgrade中的oldVersion參數永遠不會被調用。我試圖卸載應用程序,但沒有成功。奇怪的是,oldVersion總是6.或者還有其他原因,爲什麼每次手機重新啓動時我的數據庫都沒有了?Android SQLite無法升級數據庫

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(); 
     } 
     } 

    } 
    } 

解決 所以它看起來好像他們是無所事事的構造,但搬到一切都變成initialize方法。

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(); 
    } 
    } 
} 

他們這樣做是因爲他們使用一個工廠,如果不存在的話,只會創建存儲的單一實例,但他們無法從工廠的上下文。所以他們所做的就是從其中一個活動中調用初始化方法。所以通過將這些東西移動到構造函數中,並刪除所有的初始化方法。我注意到初始化方法是從多個地方調用的。如果我理解正確,那麼調用getWritableDatabase多少次並不重要,因爲數據庫是單例正確的?

所以我的問題是,即使這可能不是最佳實踐,爲什麼這不起作用?

類商店{ public Store(上下文上下文)dbHelper = new DatabaseHelper(context); db = dbHelper.getWritableDatabase(); }}

回答

0

更改此:

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

要這樣:

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

印刷應該解釋一下你的問題的堆棧跟蹤。如果沒有,請將它張貼在這裏,我們來看看。 :-)

+0

雖然沒有得到異常? – user629126

+0

你怎麼知道?你做了我建議的改變並再次運行應用程序? – plowman

+0

好吧,我想我有問題修復。它必須與調用dbhelper的類相關。我稍後會分享這個問題。謝謝 – user629126