項目中根據需求的迭代經常會遇到數據庫更新 添加新的字段的問題 下面來介紹一下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都需要這樣複雜的操作,如果有想了解
這種操作的 可以在網上查看一下相關的博客。