Android在apk更新的時候數據庫改變的(只限於在數據庫末尾添加新字段)


借鑒前輩的知識完善了一下關於Android在apk更新的時候數據庫改變的(只限於在數據庫末尾添加新字段)

@Override
    public void onUpgrade(SQLiteDatabase _db, int oldVersion, int newVersion) {
        // 函數在數據庫需要升級時被調用,
        // 一般用來刪除舊的數據庫表,
        // 並將數據轉移到新版本的數據庫表中
        /** * 要在方法里寫for循環,主要是考慮到誇版本升級, 比如有的用戶一直不升級版本,數據庫版本號一直是1, * 而客戶端最新版本其實對應的數據庫版本已經是4了, 那么我中途可能對數據庫做了很多修改,通過這個for循環,可以迭代升級,不會發生錯誤。 */
        for (int j = oldVersion + 1; j <= newVersion; j++) {
            switch (j) {
            case 2:
                addColumn(_db, new String[] { SqlVisitBean.STARTTIME, SqlVisitBean.ENDTIME }, "DB_Visit_Info");
                break;
            case 3:
                addColumn(_db, new String[] { "temp" }, "DB_Visit_Info");
                break;

            default:
                break;
            }
        }

    }
    /** * 在表中添加字段方法 操作步驟: 1、先更改表名 2、創建新表,表名為原來的表名 3、復制數據 4、刪除舊表 * * @param db * 數據庫名 * @param newColumnArr * 添加的新字段的表名數組 * @param oldTableName * 舊表名,在方法內部將舊表名修改為 _temp_+oldTableName */
    private void addColumn(SQLiteDatabase db, String[] newColumnArr, String oldTableName) {

        if (db == null || newColumnArr == null || newColumnArr.length < 1 || TextUtils.isEmpty(oldTableName)) {
            // 數據庫為空,新字段個數為0,添加字段后的字段數組個數為0,舊表名為空
            return;
        }

        // 拿到舊表中所有的數據
        Cursor cursor = db.rawQuery("select * from " + oldTableName, null);
        if (cursor == null) {
            // 如果游標為空
            return;
        }
        // 拿到原來的表中所有的字段名
        String[] oldColumnNames = cursor.getColumnNames();

        // 更改原表名為臨時表
        String tempTableName = "temp_" + oldTableName;
        db.execSQL("alter table " + oldTableName + " rename to " + tempTableName);

        // 創建新表
        if (oldColumnNames.length < 1) {
            // 如果原來的表中字段個數為0
            return;
        }

        // 創建一個線程安全的字符串緩沖對象,防止用conn多線程訪問數據庫時造成線程安全問題
        StringBuffer createNewTableStr = new StringBuffer();
        createNewTableStr.append("create table if not exists " + oldTableName + "(");
        for (int i = 0; i < oldColumnNames.length; i++) {
            if (i == 0) {
                createNewTableStr.append(oldColumnNames[i] + " integer primary key autoincrement,");
            } else {
                createNewTableStr.append(oldColumnNames[i] + ",");
            }
        }

        for (int i = 0; i < newColumnArr.length; i++) {
            if (i == newColumnArr.length - 1) {
                // 最后一個
                createNewTableStr.append(newColumnArr[i] + ")");
            } else {
                // 不是最后一個
                createNewTableStr.append(newColumnArr[i] + ",");
            }
        }
        db.execSQL(createNewTableStr.toString());

        // 復制舊表數據到新表
        StringBuffer copySQLStr = new StringBuffer();
        copySQLStr.append("insert into " + oldTableName + " select *,");
        // 有多少個新的字段,就要預留多少個' '空值給新字段
        for (int i = 0; i < newColumnArr.length; i++) {
            if (i == newColumnArr.length - 1) {
                // 最后一個
                copySQLStr.append("' ' from " + tempTableName);
            } else {
                // 不是最后一個
                copySQLStr.append("' ',");
            }
        }

        db.execSQL(copySQLStr.toString());

        // 刪除舊表
        db.execSQL("drop table if exists " + tempTableName);

        // 關閉游標
        cursor.close();
    }

暫時就是這些
感謝http://blog.csdn.net/sunnyjerry/article/details/54091345


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com