Android - Sqlite - 检测是否找不到新版本

时间:2017-09-21 08:55:39

标签: android database android-sqlite

更新:Bref:Kuffs的答案简单而正确。 MikeT的答案是一种有趣的方法。

旧版本: 我正在开发一个Android应用程序。 我需要知道是否有新的sql版本。如果我的数据库是最新的,我将触发异步操作。 但是如何触发异步操作呢?

目前,我在onNewVersion设置了true我自己的旗帜onUpgrade()。然后我在onOpen()进行检查。还有其他方法吗?

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

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

感谢。

3 个答案:

答案 0 :(得分: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");
    }
}

答案 1 :(得分:1)

您可以在onUpgrade的{​​{1}}方法中设置一个标记。

如果在您获得对OpenHelper的引用时未设置该标志,则数据库已经是最新的,不需要更新。

答案 2 :(得分: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定义中包含该表,并由onExpand通过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
);

然后根据以下内容将CARDCOLOUR添加到DBTable定义中: -

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 TABLE DEFAULT值( DBColumn 的第4个参数(第1个是列名,第2个类型,第3个为true以包含在主索引中)< / em>)填充现有行的新列。