App版本更新时对SQLite数据库表的修改问题
来源:互联网 发布:淘宝搜索流量下降 编辑:程序博客网 时间:2024/05/16 15:08
在数据库版本升级时, 我们可能会遇到这样一些情况:
- 需要扩展一个表的字段
- 删除掉原来表上某个冗余的字段
- 新建一个表
而处理上面这些问题都要在不损害旧数据库历史数据的前提下完成。
首先,我们都知道,当我们的数据库版本号从低版本到高版本的升级之后,会调用SQLiteOpenHelper中的 onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion)
方法。这时我们就可以在这里去处理这些升级逻辑。
扩展一个表的字段在onUpgrade中的实现为:
@Override public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) { //数据库表最后面添加一个字段 if(oldVersion < newVersion){ sqLiteDatabase.execSQL("ALTER TABLE ShoppingCar ADD COLUMN productDescp text"); } }
SQLite 对 ALTER TABLE 的支持是有限的,你可以在一个存在表上添加一个字段到末尾,或者是改变表的名称。但如果你想做更复杂的操作,比如删除一个表已有的字段,就要重新创建这个表并完成数据迁移,而不能使用DROP COLUMN这样方便的命令了。详见SQLite Frequently Questions
比如表ShoppingCar原来有三个字段CID(主键)、productName、productDescp,现在想删除productDescp字段,那么在onUpgrade中写法如下:
@Override public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) { //数据库表删除指定字段 if(oldVersion < newVersion){ sqLiteDatabase.beginTransaction(); //启动事务 try { sqLiteDatabase.execSQL("CREATE TEMPORARY TABLE Car (CID INTEGER PRIMARY KEY AUTOINCREMENT, " + "productName varchar(200));"); //创建临时表Car sqLiteDatabase.execSQL("INSERT INTO Car SELECT CID, productName FROM ShoppingCar;"); //保存ShoppingCar的数据 sqLiteDatabase.execSQL("DROP TABLE ShoppingCar;"); //删除ShoppingCar表 sqLiteDatabase.execSQL("CREATE TABLE ShoppingCar (CID INTEGER PRIMARY KEY AUTOINCREMENT, " + "productName varchar(200));"); //再重新建立新的ShoppingCar表,这次少了productDescp字段 sqLiteDatabase.execSQL("INSERT INTO ShoppingCar SELECT CID, productName FROM Car;");//将临时表Car上的数据保存到新建的ShoppingCar表上 sqLiteDatabase.execSQL("DROP TABLE Car;");//删除临时表Car sqLiteDatabase.setTransactionSuccessful(); } finally { sqLiteDatabase.endTransaction(); //事务结束 } } }
这样就既完成了对productDescp字段的删除也保留了原来表上的数据。
最后一种情况最简单直接执行CREATE语句就要可以了。
@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if(oldVersion < 2) { db.execSQL("CREATE TABLE newtb(Nid text, b text);"); }}
最后,该文章也是按照下面文章copy来的,谢谢了。大家可以看下。
http://www.pedant.cn/2014/08/01/sqliteopenhelper-onupgrade-ondowngrade-handle/
0 0
- App版本更新时对SQLite数据库表的修改问题
- App版本更新时对SQLite数据库升级或者降级遇到的问题
- App版本更新时对SQLite数据库升级或者降级遇到的问题
- App版本更新时对SQLite数据库升级或者降级遇到的问题
- App版本更新时对SQLite数据库升级或者降级遇到的问题
- App版本更新时对SQLite数据库升级或者降级遇到的问题
- App版本更新时对SQLite数据库升级或者降级遇到的问题
- App版本更新时对SQLite数据库升级或者降级遇到的问题
- App版本更新时对SQLite数据库升级或者降级遇到的问题
- App版本更新时对SQLite数据库升级或者降级遇到的问题
- Android版本更新时对SQLite数据库升级或者降级遇到的问题
- Android版本更新时对SQLite数据库升级或者降级遇到的问题
- 手动修改SQLITE数据库的版本
- 手动修改SQLITE数据库的版本
- iOS-App版本升级时数据库的迁移更新
- Android Sqlite 数据库版本更新
- Android SQLite数据库版本更新
- Android Sqlite 数据库版本更新
- 百分比进度框
- Python计算矩阵相乘
- JAVA问题总结之17-杨辉三角的实现
- POJ2187---Beauty Contest
- ASC 41 Problem D. Data Mining
- App版本更新时对SQLite数据库表的修改问题
- Android:Intent用法总结
- Android 集成支付宝SDK实现快捷支付--详解
- 我们工作到底为了什么(HP大中华区总裁孙振耀退休感言)--值得我们停留一刻阅读
- Ajax实现跨域请求
- 网络协议的使用
- SQL数据库的升级过程—解决WMI服务无法链接过程
- LeetCode: Balanced Binary Tree
- wireshark抓包常用过滤规则