黑马程序员安卓教程:数据库的方法
- 格式:doc
- 大小:1.76 MB
- 文档页数:4
数据库之OnCreate()方法和onUpgrade()方法
数据库帮助类已编写完成(参考数据库的创建),在该数据库帮助类中还有另外两个方法——OnCreate()方法和OnUpdate()方法,这两个方法在数据库帮助类的作用是什么?如何使用?
1.OnCreate方法
当数据库第一次被创建时会调用该方法,若数据库已存在则不调用,因此在该方法中适合做一些初始化操作,如:新建一个表,具体代码如例1-1:
例1-1
@Override
public void onCreate(SQLiteDatabase db) {
System.out.println("---------------hahahahah 数据库被创建了");
//执行sql语句
db.execSQL("create table info (_id integer primary key autoincrement, name varchar(20),
phone varchar(20))");
}
例1-1用SQL语句新建一个名称为info的表,包括字段_id(主键自增长类型),name(varchar类型且长度为20),phone(varchar类型且长度为20)。SQLite数据库是一款嵌入式轻量级的数据库,其在存储数据时并不区分数据的类型,也不校验数据的长度,所以我们在程序中所定义的字段类型以及字段长度实际上是没有意义的,仅仅供程序员查看使用,这种设计模式便于快速的操作数据,适合移动设备。
OnCreate()方法编写完成之后,运行程序,观察新建的表。由于OnCreate()方法只能在数据库第一次被创建时才会调用,所以在运行程序之前要保证该数据库并未被创建,若已存在该数据库文件,可从DDMS的文件浏览中删除该文件或直接卸载该应用。程序运行之后,打开DDMS,从文件浏览中可以查看数据库文件如图1-1所示:
图1-1所示
导出该数据库文件,使用数据库查看工具打开该数据库文件,可以看到如图1-2所示的表结构:
表结构生产处的表(info)
图1-2所示
2.OnUpgrade方法
OnUpgrade方法在数据库版本升级时会被调用,在该帮助类中编写OnUpgrade方法,如例1-2所示。
例1-2
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
System.out.println("onupgrade 数据库升级了。 更新了。。"+oldVersion+"--->"+newVersion);
}
升级该数据库的版本,假设将构造方法中的版本信息由1改为2,运行程序此时打印出OnUpgrade()方法中的输出信息,如图1-3所示。
12-01 08:01:37.949: I/System.out(14173): onupgrade 数据库升级了。 更新了。。1--->2
12-01 08:01:38.227: I/ActivityManager(68): Displayed com.itheima.dbcreate/.MainActivity:
+1s135ms
图1-3所示
如果将构造方法中的版本信息由2改为1,程序报错并提示不能做降级操作,即数据库只能升级不能降级(但android2.3可以做降级操作,这也是android2.3版本中的一个bug)。
版本升级使用场景一:
OnUpgrade()方法中新加一个表,代码如下例1-3
例1-3
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
System.out.println("onupgrade 数据库升级了。 更新了。。"+oldVersion+"--->"+newVersion);
db.execSQL("create table gaga (_id integer primary key autoincrement, name
varchar(20))");
}
运行程序,导出数据库文件,打开该文件可以看到在数据person中新建了一个表gaga,如下图1-4所示:
版本升级使用场景二:
OnUpgrade()方法中更改原表的结构,代码如例1-4所示:
例1-4
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
System.out.println("onupgrade 数据库升级了。 更新了。。"+oldVersion+"--->"+newVersion);
db.execSQL("alter table info add money varchar(20)");
}
运行程序,导出数据库文件,打开该文件可以看到在数据库person中表info新增了一个字段money,如图1-5所示:
图1-5所示
总结:在定义表时虽然字段的类型和长度对数据库底层操作无影响,但若不定义其字段的类型和长度则不符合标准的SQL语法,很有可能编译报错;在数据库版本更新中,新建的数据表不会覆盖原有的表。