sqlite數據添加字段升級具體介紹 數據庫沒升級之前的數據 數據庫升級後

項目中根據需求的迭代經常會遇到數據庫更新 添加新的字段的問題 下面來介紹一下sqlite的更新數據庫
直接上代碼了 具體改變的位置都有註釋標註 由於比較倉促 正常數據裏面應該想刪除方法中一樣都需要
加上try catch finally

public class WTWebViewStatusDB extends SQLiteOpenHelper {

    public static final String DB_NAME="WT_Status_db";
    public static final String TABLE_NAME="WCenterStatus";
    private static volatile WTWebViewStatusDB instance=null;

    private static final String CREATE_TABLE="create table if not exists "+TABLE_NAME+"("
            +"id integer primary key autoincrement,"
            +"pushNumber text,"
            +"statusName text,"
            +"isClicked integer)";
    //數據庫添加字段升級的代碼 改動1 添加字段到執行的sql語句中
    private static final String CREATE_TABLE1="create table if not exists "+TABLE_NAME+"("
            +"id integer primary key autoincrement,"
            +"pushNumber text,"
            +"statusName text,"
            +"isClicked integer,"
            +"test text)";
    //改動2 添加改變表的sql 語句  alter table 表名+ add column 添加的字段 添加字段的數據類型
    private static final String ALTER_TABLE1="alter table "+TABLE_NAME+" add column test text";

    public WTWebViewStatusDB(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    public static WTWebViewStatusDB getInstance(Context context,int version){
        if (instance==null){
            synchronized (WTWebViewStatusDB.class){
                if (instance==null){
                    //升級改動3  在外面傳遞的版本version 號升級+1
                    instance=new WTWebViewStatusDB(context,DB_NAME,null,version);
                }
            }
        }
        return instance;
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        //改動4 執行新的sql語句
//        sqLiteDatabase.execSQL(CREATE_TABLE);
        sqLiteDatabase.execSQL(CREATE_TABLE1);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
        //改動5 每當數據庫升級的時候 就走upgrade方法 然後根據新舊版本號跨越範圍進行版本的升級判斷
        //在這裏執行添加字段的sql語句
        for (int i = oldVersion; i <newVersion ; i++) {
            switch (i){
                case 1:
                    LogUtils.i("WTWebViewStatusDB","數據進行2代版本更新 添加一個測試的字段test");
                    sqLiteDatabase.execSQL(ALTER_TABLE1);
            }
        }

    }

    public void deleteTable() {
        SQLiteDatabase database = getWritableDatabase();
        database.execSQL("drop table " + TABLE_NAME);
    }

    public ArrayList<StatusBean> queryAllStatus(){
        ArrayList<StatusBean> statusNames = new ArrayList<>();
        SQLiteDatabase db = getReadableDatabase();
        Cursor query = db.query(TABLE_NAME, null, null, null, null, null, null);
        for (query.moveToFirst();!(query.isAfterLast());query.moveToNext()){
            String pushNumber = query.getString(1);
            String statusName = query.getString(2);
            int isClicked = query.getInt(3);
            //改動6 在對應的 增刪改查方法中添加數據庫升級後新增字段
            String test = query.getString(4);
            //改動7  在對應bean類中 添加數據庫升級後新增加的字段 以及對應的set get 和構造方法新增的字段
            statusNames.add(new StatusBean(pushNumber,statusName,isClicked,test));

        }
        query.close();
        return statusNames;

    }

    public void insertStatus(StatusBean statusBean){
        SQLiteDatabase db = getReadableDatabase();
        ContentValues cv = new ContentValues();
        if (statusBean!=null){
            String pushNumber = statusBean.getPushNumber();
            String statuName = statusBean.getStatuName();
            int isClicked = statusBean.getIsClicked();
            String test = statusBean.getTest();

            ArrayList<StatusBean> statusBeans = queryAllStatus();
            if (statusBeans.size()>0){
                for (int i = 0; i < statusBeans.size(); i++) {
                    if (pushNumber.equals(statusBeans.get(i).getPushNumber())){
                        return;
                    }

                }
            }

            cv.put("pushNumber",pushNumber);
            cv.put("statusName",statuName);
            cv.put("isClicked",isClicked);
            cv.put("test",test);
            db.insert(TABLE_NAME,null,cv);
            db.close();
        }
    }

    public void deleteAllStatus(){
        SQLiteDatabase db = getWritableDatabase();


        try {
            db.execSQL("delete from "+TABLE_NAME);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            db.close();
        }
    }

    public void updateStatusClick(StatusBean statusBean){
        SQLiteDatabase db = getReadableDatabase();
        ContentValues cv = new ContentValues();
        if (statusBean!=null){
            String pushNumber = statusBean.getPushNumber();
//            String statuName = statusBean.getStatuName();
            int isClicked = statusBean.getIsClicked();
//            cv.put("pushNumber",pushNumber);
//            cv.put("statusName",statuName);
            cv.put("isClicked",isClicked);
            db.update(TABLE_NAME,cv,"pushNumber=?", new String[]{pushNumber});
            db.close();

        }


    }

    public void deleteItem(String pushNumber){
        SQLiteDatabase db = getReadableDatabase();
        db.delete(TABLE_NAME,"pushNumber=?",new String[]{pushNumber});
        db.close();
    }


}

數據庫沒升級之前的數據

數據庫升級後

升級後走的onUpgrade方法



升級後新增字段結果


最終我們發現之前的數據沒有丟失 成功完成數據庫的版本升級
當然網上也有需要人會完美控制數據 吧數據庫在本地創建 然後啓動app的時候把數據庫通過文件流
的方式保存在sd卡上 在操作sd卡上的數據庫 當然這樣的是非常嚴謹的做法 擁有兩套數據庫可以保證
數據在任何突發情況下都有一個本地備份。當然不是所有的app都需要這樣複雜的操作,如果有想了解
這種操作的 可以在網上查看一下相關的博客。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章