很久以前设计的数据库创建与升级的方法,此设计避免了升级的时候需要多处修改的弊端。 代码如下:
public class DBAdatper {
private DBHelper dbHelper;private SQLiteDatabase _db;private final Context context;public DBAdatper(Context context) {super();this.context = context;dbHelper = new DBHelper(context, DATABASE_NAME, null, DB_VERSION);_db = dbHelper.getWritableDatabase();}// 数据库名private static final String DATABASE_NAME = "test";//建表语句 此部分只是用户第一次安装的时候会在oncreate方法中调用//请注意CREATE部分不要做任何修改 所有的数据库修改都应该在 update_sql中进行private static final String CREATE[] = new String[] {"create table type (tid integer primary key,name varchar(50));",};//数据库更新升级,此部分会在onupdate方法中调用//请注意所有的数据库结构的修改操作都要在此处进行 否则会出现升级混乱的问题private static String[] UPDATE = new String[]{};// 当前数据库版本 请保证 DB_VERSION的值等于update_sql.length+1private static final int DB_VERSION = UPDATE.length+1;/*** 数据库创建对象** @author popo**/private static class DBHelper extends SQLiteOpenHelper {public DBHelper(Context context, String name, CursorFactory factory,int version) {
super(context, name, factory, version);// TODO Auto-generated constructor stub}@Overridepublic void onCreate(SQLiteDatabase db) {// TODO Auto-generated method stub//创建表结构int sql_numbers = CREATE.length;//执行建表语句for(int i=0;i<sql_numbers;i++){try{db.execSQL(CREATE[i]);}catch (Exception e) {// TODO: handle exception}}//执行升级部分 保证新装用户也可以执行到升级部分onUpgrade(db, 1, DB_VERSION);}/*** 数据库升级部分*/@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// TODO Auto-generated method stubint version = newVersion-1;//由于数组的长度是从0开始的 而数据库版本是从一开始 所以 i=oldVersion-1for(int i=oldVersion-1;i<version;i++){try{db.execSQL(UPDATE[i]);}catch (Exception e) {// TODO: handle exception}}}}
}
这样数据库升级只在UPDATE数组中添加需要升级的SQL语句就可以了 ,不需要修改 DB_VERSION 不需要 修改 oncreate , onUpgrade 。
有什么不妥之处,望指正!