日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android自动更新列表,Android数据库表结构自动升级

發布時間:2025/4/5 Android 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android自动更新列表,Android数据库表结构自动升级 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Android App開發如果涉及過數據庫的朋友們肯定會碰到數據庫升級的工作,Android官方的建議辦法是override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)并在其中通過數據庫版本比較寫SQL增加表字段、創建新表等操作來達到數據庫升級的功能,思路非常OK,但是項目做久了發現這塊代碼變超級龐大,仔細一看全是流水賬代碼,自己項目中曾經也是如此,時間久了代碼量十分恐怖,關鍵的是無法通過重構減少代碼量,類似如下:

db_upgrade.png

其實,之前寫過一個輕量級的SQLite ORM,已經做到數據庫自動創建,通過以面向對象方式進行增刪改查,非常缺少自動升級這個功能。

通過查閱相關資料,得知sqlite數據庫里默認會生成兩個表分別是:sqlite_sequence和sqlite_master,今天看的是sqlite_master,里面存放了每張表結構(創建表的SQL):

sqlite_master.png

所以,思路就很簡單了,同過檢索此表可以知道新建的表是否在其中存在:

不存表在則創建新表;

存在表再檢查所有字段是否存在,不存在則加字段(數據庫升級的原則就是只增不減);

所以,寫兩個工具方法即可:

static boolean isTableExist(SQLiteDatabase db, String tableName) {

Cursor cursor = null;

try {

cursor = db.rawQuery("SELECT count(*) FROM sqlite_master WHERE type='table' AND name=?", new String[]{tableName});

boolean hasNext = cursor.moveToNext();

return hasNext && cursor.getInt(0) > 0;

} finally {

if (cursor != null) {

cursor.close();

}

}

}

static boolean isColumnExist(SQLiteDatabase db, String tableName, String columnName) {

Cursor cursor = null;

try {

cursor = db.rawQuery("SELECT count(*) FROM sqlite_master WHERE tbl_name = ? AND (sql LIKE ? OR sql LIKE ?);",

new String[]{tableName, "%(" + columnName + "%", "%, " + columnName + " %"});

boolean hasNext = cursor.moveToNext();

return hasNext && cursor.getInt(0) > 0;

} finally {

if (cursor != null) {

cursor.close();

}

}

}

如何運用2個方法自動升級呢:

@Override

public final void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

autoMigrate(db, mTableClasses);

}

private void autoMigrate(SQLiteDatabase db, List> tableClasses) {

for (Class extends Entity> clazz : tableClasses) {

String tableName = ReflectTools.getTableName(clazz);

boolean exist = ReflectTools.isTableExist(db, tableName);

if (exist) {

Field[] fields = ReflectTools.getClassFields(clazz);

for (Field field : fields) {

Column column = field.getAnnotation(Column.class);

if (column == null) {

continue;

}

String columnName = !TextUtils.isEmpty(column.name()) ? column.name() : field.getName();

String dataType = ReflectTools.getDataTypeByField(field);

boolean columnExist = ReflectTools.isColumnExist(db, tableName, columnName);

if (!columnExist) {

db.execSQL("ALTER TABLE " + tableName + " ADD " + columnName + " " + dataType);

}

}

} else {

db.execSQL(SQLBuilder.buildCreateSQL(clazz).getSql());

}

}

}

可能你們已經注意到這里有幾個外來方法和變量,它們來自于上面所說的輕量級SQLite ORM,還有請注意onUpgrade()是加了final修飾的,意味著子類無需手動升級了。

所以,關于數據庫升級,你所需要做的事情就是該創建表對象的就創建表對象,該加字段的就加字段,最后別忘記把數據庫版本號升級下就好了,因為只有當Android檢測出你的數據庫版本好變了才會走進onUpgrade()。

總結

以上是生活随笔為你收集整理的android自动更新列表,Android数据库表结构自动升级的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 色呦呦一区二区 | 91久久综合亚洲鲁鲁五月天 | 欧美激情h | 亚洲69视频| 777视频在线观看 | 国模av在线 | 秋霞网一区二区三区 | 熟女自拍一区 | 狠狠操天天操 | 在线日韩一区 | 伊人免费在线观看 | 成人区人妻精品一区 | 真人一毛片 | 亚洲视频欧洲视频 | 日日夜夜干| 三上悠亚在线观看一区二区 | 婷婷伊人网| 亚洲va久久久噜噜噜久久天堂 | 狠狠干综合| 伊人中文在线 | 毛片av网址| 欧美 变态 另类 人妖 | 91久久极品少妇xxxxⅹ软件 | 一区二区三区欧美日韩 | 国产精品999视频 | 美女又大又黄 | 欧美中文 | 日韩一级理论片 | 激情久久av一区av二区av三区 | 娇妻第一次尝试交换的后果 | 在线播放免费av | 国产又好看的毛片 | 人人爽人人爽人人 | 国产污污| 澳门一级黄色片 | 各种含道具高h调教1v1男男 | 国产精品欧美综合亚洲 | 婷婷综合在线观看 | 特黄网站 | 日韩一区二区免费播放 | 国产一级二级三级在线 | 国产精品刘玥久久一区 | 波多野吉衣久久 | 性欧美一区二区 | 91精品99| 五色天婷婷 | 国产精品5区 | 99re久久精品国产 | 日韩欧美一区二区在线观看 | 在线视频 日韩 | 老司机在线精品视频 | 免费视频91蜜桃 | 牛牛av | 天天射寡妇 | 丰满少妇在线观看资源站 | 怡春院国产 | 免费av黄色 | 香蕉色视频 | www.毛片.com| 美女久久| 成人日b视频 | 日本韩国欧美一区二区三区 | 伊人网av| 国产女人在线 | 日日夜夜噜噜噜 | 一本大道久久 | 懂色av一区二区三区在线播放 | 亚洲一二三四五 | 日韩欧美国产精品综合嫩v 国产小毛片 | 国产欧美一区二区三区四区 | 肌肉猛男裸体gay网站免费 | 亚洲av成人一区二区国产精品 | av无码一区二区三区 | 亚洲中文字幕无码一区二区三区 | 色成人亚洲 | 免费爱爱视频 | 伊人成人动漫 | 情趣五月天 | jzjzz成人免费视频 | 国产偷亚洲偷欧美偷精品 | 老熟女一区二区三区 | 一道本一区 | 老熟女重囗味hdxx69 | av2018| 日韩免费av| 91sao| 男女男精品网站 | 国产激情视频一区 | av导航在线 | 三级五月天 | 久草精品在线观看视频 | 亚洲欧美日韩电影 | 樱花影院最新免费观看攻略 | 污污污www精品国产网站 | 交专区videossex非洲 | 国产亚洲区 | 欧美丰满老熟妇aaaa片 | 精品黄网 | 日本三级日本三级日本三级极 |