2017-09-21 52 views
0

更新:Bref:Kuffs的答案簡單而正確。 MikeT的答案是一個有趣的方法。Android - Sqlite - 檢測新版本沒有找到

舊版本: 我正在開發一個android應用程序。 我需要知道是否有新的sql版本。如果我的數據庫是最新的,我將觸發異步操作。 但是我怎樣才能觸發我的異步行爲?

目前,我有我自己的國旗onNewVersion誰設置爲trueonUpgrade()。然後我在onOpen()進行檢查。還有其他方法嗎?

@override 
onUpgrade(...) { 
    onNewVersion = true; 
    ... 
} 

@override 
onOpen(...) { 
    if (onNewVersion == FALSE) 
     triggerAction(); 
} 

謝謝。

+0

這個我幫你。 https://stackoverflow.com/questions/8133597/android-upgrading-db-version-and-adding-new-table –

回答

0

還有其他方法嗎?

是的,我個人使用一種僞/想/需要的模式,並在短期比較這對作爲需要什麼實際存在的列,表創建索引(表索引)/加(列)。

因此,我不使用版本和onUpgrade是空的。

例如這些是在我的SQLiteOpenhelper子類中的核心方法: -

@Override 
    public void onCreate(SQLiteDatabase db) { 
     usable = this.onExpand(db,false); 
    } 
    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldversion, int newversion) { 
    } 

    public boolean onExpand(SQLiteDatabase db, boolean buildandexpand) { 
     boolean rv = true; 
     if (db == null) { 
      db = instance.getWritableDatabase(); 
     } 
     // Is the Database definition valid to use? 
     if (DBConstants.cardonsier.isDBDatabaseUsable()) { 
      ArrayList<String> buildsql = DBConstants.cardonsier.generateDBBuildSQL(db); 
      // Anything to build 
      if (!buildsql.isEmpty()) { 
       // YES so build the Database 
       DBConstants.cardonsier.actionDBBuildSQL(db); 
      } 
      if (buildandexpand) { 
       ArrayList<String> altersql = DBConstants.cardonsier.generateDBAlterSQL(db); 
       if (!altersql.isEmpty()) { 
        DBConstants.cardonsier.actionDBAlterSQL(db); 
       } 
      } 
     } 
     else { 
      rv = false; 
     } 
     return rv; 
    } 

DBConstants.cardoniser指DBDatabase對象定義爲: -

static final DBDatabase cardonsier = new DBDatabase(DATABASENAME, 
      new ArrayList<>(Arrays.asList(
        DBCardsTableConstants.CARDS, 
        DBUsertableConstants.USERS, 
        DBCardUserLinkTableConstants.CARDUSERLINKS, 
        DBPreftableConstants.PREFS, 
        DBPayeestableContants.PAYEES, 
        DBCategoriestableConstants.CATEGORIES, 
        DBCardCategoryLinkTableConstants.CARDCATEGORYLINKS, 
        DBCardPayeeLinkTableConstants.CARDPAYEELINKS, 
        DBTransactionsTableConstants.TRANSACTIONS, 
        DBCardTypesTableConstants.CARDTYPES 
      )) 
    ); 

即DBTABLE對象的列表,他們包括DBColumn對象,例如: -

static final DBTable CARDS = new DBTable(CARDS_TABLE, 
     new ArrayList<>(Arrays.asList(
       CARDID, 
       CARDOWNER, 
       CARDNAME, 
       CARDTYPEREF, 
       CARDNUMBER, 
       CARDCVVCODE, 
       CARDPIN, 
       CARDNOTES, 
       CARDEXPIRYDATE, 
       CARDNAMEONCARD 
     )) 
); 

列正在定義如: -

static final DBColumn CARDID = new DBColumn(true); 
static final DBColumn CARDOWNER = new DBColumn(
     CARDOWNER_COL, 
     SQLINTEGER, 
     false, 
     "0" 
); 
static final DBColumn CARDNAME = new DBColumn(
     CARDNAME_COL, 
     SQLTEXT, 
     false, 
     "" 
); 
static final DBColumn CARDTYPEREF = new DBColumn(
     CARDTYPEREF_COL, 
     SQLINTEGER, 
     false, 
     "0" 
); 

注意!第一列CARDID使用標準_id列的快捷鍵構造函數。

要添加新列,只需定義DBColumn並在DBTable定義中包括DBColumn即可。在新列的情況下,onExpand方法將通過DBDatabase的actionDBAlterSQL方法添加列。新表需要上述內容以及DBDatabase定義中的表格,並通過actionDBBuildSQL方法由onExpand應用。當應用程序啓動時,也會調用。但是,true正在通過,因此調用了actionDBAlterSQL方法。

作爲示例中加入: -

private static final String CARDCOLOUR_COL = "cardcolour"; 
.......... 
static final DBColumn CARDCOLOUR = new DBColumn(
     CARDCOLOUR_COL, 
     SQLINTEGER, 
     false, 
     Long.toString(0x00_00_00_00_00L) 
     // Flag, alpha, red, green, blue 
     // Flag used to inidcate if colour has been set 
); 

,然後加入CARDCOLOURDBTable定義爲每: -

static final DBTable CARDS = new DBTable(CARDS_TABLE, 
     new ArrayList<>(Arrays.asList(
       CARDID, 
       CARDOWNER, 
       CARDNAME, 
       CARDTYPEREF, 
       CARDNUMBER, 
       CARDCVVCODE, 
       CARDPIN, 
       CARDNOTES, 
       CARDEXPIRYDATE, 
       CARDNAMEONCARD, 
       CARDCOLOUR  //<<<<<<<<<< 
     )) 
); 

結果(顯影時存在註釋記錄): -

09-22 08:30:26.802 2713-2713/? D/DBEXPAND: Expanding Database Schema Usability=true 
09-22 08:30:26.803 2713-2713/? D/DBEXPAND: Build SQL is as follows:- 
09-22 08:30:26.803 2713-2713/? D/DBEXPAND: ALTERSQL is as folows:- 
09-22 08:30:26.807 2713-2713/? D/DBEXPAND: ALterSQL Line= ALTER TABLE cards ADD COLUMN cardcolour INTEGER DEFAULT 0 ; 

生成的已填充表格如下所示: -

enter image description here

使用ALTER TABLEDEFAULT值(DBColumn(第一第四參數是列名,第二類型,第三真實在主索引包括))填充爲現有行的新列。

+0

你如何檢查數據庫是否是最新的? –

+1

基本上通過檢查sqlite_master和PRAGMA來比較僞模式與真實數據庫。除了'onCreate'調用'onExpand'之外,'onExpand'也被稱爲例如啓動App時。 'DBHelper.getHelper(this).onExpand(mDBDAO.getDB(),true);' – MikeT

+0

@ Anh-TuanMai先前的評論解釋(簡要地)。我也更新了答案,並提供了一個真實的例子。 – MikeT

1

檢查onUpgrade

當數據庫需要升級時調用。實施 應該使用此方法刪除表,添加表或執行任何其他需要升級到新的模式版本的 。

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    if (oldVersion < 5) { 
     db.execSQL("ALTER_TABLE_STATEMENT"); 
    } 
    if (oldVersion < 6) { 
     db.execSQL("ALTER_TABLE_STATEMENT2"); 
    } 
} 
+0

也許我的問題不清楚,因爲我的數據庫是最新的,'onUpgrade()'不是調用。如果我的數據庫是最新的,我想觸發一個動作。我怎樣才能做得更好? –

+1

所以,首先,你必須檢查數據庫是否是最新的?好了嗎? –

+2

要小心使用'oldVersion == 5'等。如果跳過某個版本,最好使用'oldVersion <5'。例如,如果用戶從V4升級到V7,則不會調用您的中間Sql語句。 – Kuffs

1

你可以設置一個標誌,你對你SQLiteOpenHelperonUpgrade方法中。

如果在您引用OpenHelper時未設置該標誌,那麼該數據庫已經是最新的並且不需要更新。