若是你足够细心,必定会发现 MyDatabaseHelper 中还有一个空方法呢!没错,onUpgrade() 方法是用于对数据库进行升级的,它在整个数据库的管理工做当中起着很是重要的做用,可 千万不能忽视它哟。shell
目前 DatabaseTest 项目中已经有一张 Book 表用于存放书的各类详细数据,若是咱们想 再添加一张 Category 表用于记录书籍的分类该怎么作呢?数据库
好比 Category 表中有 id(主键)、分类名和分类代码这几个列,那么建表语句就能够 写成:ide
create table Category (工具
id integer primary key autoincrement, category_name text,this
category_code integer)code
接下来咱们将这条建表语句添加到 MyDatabaseHelper 中,代码以下所示:blog
public class MyDatabaseHelper extends SQLiteOpenHelper {rem
public static final String CREATE_BOOK = "create table Book ("get
+ "id integer primary key autoincrement, "it
+ "author text, "
+ "price real, "
+ "pages integer, "
+ "name text)";
public static final String CREATE_CATEGORY = "create table Category ("
+ "id integer primary key autoincrement, "
+ "category_name text, "
+ "category_code integer)";
private Context mContext;
public MyDatabaseHelper(Context context, String name, CursorFactory factory, int version) {
super(context, name, factory, version);
mContext = context;
}
@Override
public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_BOOK); db.execSQL(CREATE_CATEGORY);
Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).
show();
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
看上去好像都挺对的吧,如今咱们从新运行一下程序,并点击 Create database 按钮,咦? 居然没有弹出建立成功的提示。固然,你也能够经过 adb 工具到数据库中再去检查一下,这 样你会更加地确认,Category 表没有建立成功!
其实没有建立成功的缘由不难思考,由于此时 BookStore.db 数据库已经存在了,以后不 管咱们怎样点击 Create database 按钮,MyDatabaseHelper 中的 onCreate()方法都不会再次执 行,所以新添加的表也就没法获得建立了。
解决这个问题的办法也至关简单,只须要先将程序卸载掉,而后从新运行,这时 BookStore.db 数据库已经不存在了,若是再点击 Create database 按钮,MyDatabaseHelper 中 的 onCreate()方法就会执行,这时 Category 表就能够建立成功了。
不过经过卸载程序的方式来新增一张表毫无疑问是很极端的作法,其实咱们只须要巧妙 地运用 SQLiteOpenHelper 的升级功能就能够很轻松地解决这个问题。修改 MyDatabaseHelper中的代码,以下所示:
public class MyDatabaseHelper extends SQLiteOpenHelper {
……
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists Book");
db.execSQL("drop table if exists Category");
onCreate(db);
}
}
能够看到,咱们在 onUpgrade()方法中执行了两条 DROP 语句,若是发现数据库中已经 存在 Book 表或 Category 表了,就将这两张表删除掉,而后再调用 onCreate()方法去从新创 建。这里先将已经存在的表删除掉,是由于若是在建立表时发现这张表已经存在了,就会直 接报错。
接下来的问题就是如何让 onUpgrade()方法可以执行了,还记得 SQLiteOpenHelper 的构 造方法里接收的第四个参数吗?它表示当前数据库的版本号,以前咱们传入的是 1,如今只 要传入一个比 1 大的数,就可让 onUpgrade()方法获得执行了。修改 MainActivity 中的代码, 以下所示:
public class MainActivity extends Activity {
private MyDatabaseHelper dbHelper;
@Override
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 2); Button createDatabase = (Button) findViewById(R.id.create_database); createDatabase.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
dbHelper.getWritableDatabase();
}
});
}
}
这里将数据库版本号指定为 2,表示咱们对数据库进行升级了。如今从新运行程序,并点击 Create database 按钮,这时就会再次弹出建立成功的提示。为了验证一下 Category 表是 不是已经建立成功了,咱们在 adb shell 中打开 BookStore.db 数据库,而后键入.table 命令, 结果如图 6.19 所示。
图 6.19
接着键入.schema 命令查看一下建表语句,结果如图 6.20 所示。
图 6.20
由此能够看出,Category 表已经建立成功了,同时也说明咱们的升级功能的确起到了做用。