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

歡迎訪問 生活随笔!

生活随笔

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

Android

Android 数据库升级解决方案

發布時間:2025/3/19 Android 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android 数据库升级解决方案 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

請考慮如下情況:

在數據庫升級時,不同版本的數據庫,他們定義的表結構完全可能是不一樣的,比如V1.0的表A有10個column,而在V1.1的表A有12個colum,在升級時,表A增加了兩列,此時我們應該怎么做呢。

總體思路

?1,將表A重命名,改了A_temp。

2,創建新表A。

3,將表A_temp的數據插入到表A。

下面代碼列出了更新表的實現,upgradeTables,給定表名,更新的列名,就可以實現數據庫表的更新。

/*** Upgrade tables. In this method, the sequence is:* <b>* <p>[1] Rename the specified table as a temporary table.* <p>[2] Create a new table which name is the specified name.* <p>[3] Insert data into the new created table, data from the temporary table.* <p>[4] Drop the temporary table.* </b>** @param db The database.* @param tableName The table name.* @param columns The columns range, format is "ColA, ColB, ColC, ... ColN";*/ protected void upgradeTables(SQLiteDatabase db, String tableName, String columns) {try{db.beginTransaction();// 1, Rename table.String tempTableName = tableName + "_temp";String sql = "ALTER TABLE " + tableName +" RENAME TO " + tempTableName;execSQL(db, sql, null);// 2, Create table.onCreateTable(db);// 3, Load datasql = "INSERT INTO " + tableName +" (" + columns + ") " +" SELECT " + columns + " FROM " + tempTableName;execSQL(db, sql, null);// 4, Drop the temporary table.execSQL(db, "DROP TABLE IF EXISTS " + tempTableName, null);db.setTransactionSuccessful();}catch (SQLException e){e.printStackTrace();}catch (Exception e){e.printStackTrace();}finally{db.endTransaction();} }

?

得到數據庫表的列名

我們可以通過SQL表得到表的列名。 這里需要注意的一點,int columnIndex = c.getColumnIndex("name"); 這里根據name去取得index。?

protected String[] getColumnNames(SQLiteDatabase db, String tableName) {String[] columnNames = null;Cursor c = null;try{c = db.rawQuery("PRAGMA table_info(" + tableName + ")", null);if (null != c){int columnIndex = c.getColumnIndex("name");if (-1 == columnIndex){return null;}int index = 0;columnNames = new String[c.getCount()];for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()){columnNames[index] = c.getString(columnIndex);index++;}}}catch (Exception e){e.printStackTrace();}finally{closeCursor(c);}return columnNames; }

  

upgradeTables方法應該是在onUpgrade方法中去調用。?

數據庫升級的意義?

在應用程序開發的過程中,數據庫的升級是一個很重要的組成部分(如果用到了數據庫),因為程序可能會有V1.0,V2.0,當用戶安裝新版本的程序后,必須要保證用戶數據不能丟失,對于數據庫設計,如果發生變更(如多添加一張表,表的字段增加或減少等),那么我們必須想好數據庫的更新策略。

1,定義數據庫版本

數據庫的版本是一個整型值,在創建SQLiteOpenHelper時,會傳入該數據庫的版本,如果傳入的數據庫版本號比數據庫文件中存儲的版本號大的話,那么SQLiteOpenHelper#onUpgrade()方法就會被調用,我們的升級應該在該方法中完成。

2,如何寫升級邏輯

假如我們開發的程序已經發布了兩個版本:V1.0,V1.2,我們正在開發V1.3。每一版的數據庫版本號分別是18,19,20。

對于這種情況,我們應該如何實現升級?

用戶的選擇有: ? ? ? ? ? ? ? ? ??

1)?V1.0 -> V1.3? DB 18 -> 20 ? ? ? ? ? ? ? ? ?

2)?V1.1 -> V1.3? DB 19 -> 20 ? ? ?

3,注意

數據庫的每一個版本所代表的數據庫必須是定義好的,比如說V18的數據庫,它可能只有兩張表TableA和TableB,如果V19要添加一張表TableC,如果V20要修改TableC,那么每一個版本所對應的數據庫結構如下:

V18? --->? TableA, TableB

V19? --->? TableA, TableB, TableC

V20? --->? TableA, TableB, TableC (變更)

onUpgrade()方法的實現如下:

// Pattern for upgrade blocks://// if (upgradeVersion == [the DATABASE_VERSION you set] - 1){// .. your upgrade logic..// upgradeVersion = [the DATABASE_VERSION you set]// }public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){int upgradeVersion = oldVersion;if (18 == upgradeVersion) {// Create table CString sql = "CREATE TABLE ...";db.execSQL(sql);upgradeVersion = 19;}if (20 == upgradeVersion) {// Modify table CupgradeVersion = 20;}if (upgradeVersion != newVersion) {// Drop tablesdb.execSQL("DROP TABLE IF EXISTS " + tableName);// Create tablesonCreate(db);}}

  

從上面的代碼可以看到,我們在onUpgrade()方法中,處理了數據庫版本從18 -> 20的升級過程,這樣做的話,不論用戶從18 -> 20,還是從19 -> 20,最終程序的數據庫都能升級到V20所對應的數據庫結構。 ?

4,如何保證數據不丟失

這是很重要的一部分,假設要更新TableC表,我們建議的做法是:???????

1)?將TableC重命名為TableC_temp

? ? ? ?SQL語句可以這樣寫:ALERT TABLE TableC RENAME TO TableC_temp;

2)?創建新的TableC表

3)?將數據從TableC_temp中插入到TableC表中

? ? ? ?SQL語句可以這樣寫:INSERT INTO TableC (Col1, Col2, Col3) SELECT (Col1, Col2, Col3) FROM TableC_temp;????????????????

???????????????????
經過這三步,TableC就完成了更新,同時,也保留了原來表中的數據。??

注意:

在onUpgrade()方法中,刪除表時,注意使用事務處理,使得修改能立即反應到數據庫文件中。 ? ? ??

SQL語句

由于Android是使用開源的SQLite3作為其數據庫,所以,我們在開發數據庫模塊時,一定要注意SQLite3支持哪些關鍵字,函數等,不是所有的關鍵字,SQLite都是支持的。

下面列出了一些參考鏈接:

SQLite3官方文檔:http://sqlite.org/

W3CSchool網站:http://www.w3school.com.cn/sql/index.asp/

SQL語句寫得好壞能直接影響到數據庫的操作。我曾經就遇到過SQL語句影響查詢性能,更新3000條記錄,用時30移左右,但在對WHERE條件的字段加上索引后,性能提升到3~4秒。

總結

以上是生活随笔為你收集整理的Android 数据库升级解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 中文字幕人妻互换av久久 | 欧美青草视频 | 性生活免费网站 | 18黄暴禁片在线观看 | 91在线一区二区三区 | 99re这里 | 国产精品久久久久久久免费观看 | 韩国av中文字幕 | 日韩在线资源 | 国产视频首页 | 亚洲奶汁xxxx哺乳期 | 亚洲综合大片69999 | 97人人草 | 在线观看 亚洲 | 欧美三个黑人玩3p | 国产成人无码精品 | 久操青青 | 99视频在线观看免费 | 在线观看日韩欧美 | 综合av | 中文字幕在线观看视频一区二区 | 亚洲中文字幕97久久精品少妇 | 91国自产精品中文字幕亚洲 | 国产在线v | 国产视频在线观看免费 | av香蕉| 成人无码精品1区2区3区免费看 | 什么网站可以看毛片 | 1000部多毛熟女毛茸茸 | 欧洲成人午夜精品无码区久久 | 国产一区二区免费 | 日本黄区免费视频观看 | 国产精品天美传媒入口 | 国产在线一区二区视频 | 欧美激情欧美激情在线五月 | www.自拍| 一区二区三区在线观看视频 | 精品国产一区二区三区在线观看 | 亚洲免费精品视频在线观看 | 欧美性生活 | 亚洲第一视频在线播放 | 欧洲一级黄色片 | 日韩精品无码一区二区三区 | 久久久久噜噜噜亚洲熟女综合 | 国产精九九网站漫画 | 黄色大片久久 | 影音先锋成人资源 | 成年人免费在线看 | 亚洲女人网 | 性色av一区二区三区红粉影视 | 亚洲网站色 | 97国产精品视频 | 国产女同91疯狂高潮互磨 | 欧美一区二区三区免费看 | 四虎色 | 一级片观看 | 中国av片| 国产经典三级 | 国产麻豆剧传媒精品国产av | 亚洲大片| 欧美三级一区 | 黄色片视频免费看 | 国产精品手机在线 | 91麻豆成人精品国产 | 亚洲国产精品无码久久久久高潮 | 亚洲一区二区三区黄色 | 成 年 人 黄 色 大 片大 全 | 色哟哟欧美精品 | 一区二区视频国产 | 夜夜高潮夜夜爽国产伦精品 | 男男肉耽高h彩漫 | 亚洲欧美韩日 | 你懂的在线播放 | 午夜寂寞视频 | 亚洲欧美激情一区二区三区 | 亚洲国产成人精品女人久久 | 国产免费黄色av | av毛片精品 | 亚洲一卡二卡在线 | 深爱婷婷网| 我和我的太阳泰剧在线观看泰剧 | av电影一区二区 | www成人在线观看 | 五月天丁香 | 韩国一级淫一片免费放 | 好男人www | av免费看在线 | 夫妻黄色片 | 国产精品久久一区二区三区 | 91一区 | 国模av| 好吊妞这里有精品 | 中文人妻熟女乱又乱精品 | 奇米影视亚洲春色 | 日韩中文字幕在线免费观看 | 色就是色欧美 | av黄色在线观看 | 美女激情av| 日韩影院一区二区 |