如果你足够细心,一定会发现 MyDatabaseHelper 中还有一个空方法呢!没错,onUpgrade() 方法是用于对数据库进行升级的,它在整个数据库的管理工作当中起着非常重要的作用,可 千万不能忽视它哟。

目前 DatabaseTest 项目中已经有一张 Book 表用于存放书的各种详细数据,如果我们想 再添加一张 Category 表用于记录书籍的分类该怎么做呢?

比如 Category 表中有 id(主键)、分类名和分类代码这几个列,那么建表语句就可以 写成:

create table Category (

id integer primary key autoincrement, category_name text,

category_code integer)

接下来我们将这条建表语句添加到 MyDatabaseHelper 中,代码如下所示:

public class MyDatabaseHelper extends SQLiteOpenHelper {

public static final String CREATE_BOOK = "create table Book ("

+ "id integer primary key autoincrement, "

+ "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
表已经创建成功了,同时也说明我们的升级功能的确起到了作用。

最新文章

  1. MySQL基础
  2. IOS客户端UIwebview下web页面闪屏问题
  3. 项目、SVN clean的一些事
  4. Spring的辅助类
  5. 配置 Cocoapods的简单配置及胡思乱想
  6. 原创-兼容IE8的placeholder
  7. poj 2796 Feel Good 单调栈区间问题
  8. 关于降低android手机摄像头预览分辨率
  9. Java中Timer和TimerTask的使用
  10. angular 学习笔记
  11. k64 datasheet学习笔记12---System Integration Module (SIM)
  12. swift 学习- 25 -- 协议 02
  13. Scala-Unit4-Scala数组/集合
  14. jQuery应用实例2:表格隔行换色
  15. Linux内存管理--基本概念【转】
  16. python3 自学第一天,python 介绍
  17. 复习回顾(String,StringBuffer,Arrays方法总结)
  18. Go匿名函数
  19. 如何查看 EBS 环境上的 INV RUP 版本号
  20. 使用 CGContextRef 进行简单内容绘制

热门文章

  1. grep 相关
  2. 10个你必须掌握的Linux超酷VI命令技巧
  3. java中final,finally和finalize的区别
  4. NSArray其中的方法--遍历,
  5. App lifecycle(UWP深入学习一)
  6. Checked ==true ? "Y":"N" ;
  7. PHP header函数使用教程
  8. Excel表3级数据整理工具
  9. Hadoop on Docker
  10. 用VS连接oracle数据库时ORA-12504错误