Android 使用sqlite更改数据库结构
我的应用程序已经上市了,现在我想在表中添加一个额外的列,在我研究的过程中,我发现了onUpgrade()方法,在该方法中,我可以使用ALTER table添加该列,并增加我的数据库版本,但混淆的是,当用户收到更新应用程序的通知时,该方法是否可以在不丢失任何以前的数据的情况下工作,如果是,那么,如果新用户第一次安装应用程序,这个onUpgrade()方法对他们有效吗?该列将被添加,或者只有onCreate()方法对他们有效。您只需为每个版本添加if语句Android 使用sqlite更改数据库结构,android,sqlite,Android,Sqlite,我的应用程序已经上市了,现在我想在表中添加一个额外的列,在我研究的过程中,我发现了onUpgrade()方法,在该方法中,我可以使用ALTER table添加该列,并增加我的数据库版本,但混淆的是,当用户收到更新应用程序的通知时,该方法是否可以在不丢失任何以前的数据的情况下工作,如果是,那么,如果新用户第一次安装应用程序,这个onUpgrade()方法对他们有效吗?该列将被添加,或者只有onCreate()方法对他们有效。您只需为每个版本添加if语句 @Override public void
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (newVersion > oldVersion) {
// This inner check isn't completely necessary if you can perform all upgrades in one step
if (newVersion == 2 && oldVersion == 1) {
migrate1To2(db); // TODO: Implement
}
} else {
// DROP
onCreate(db);
}
}
通常,在
onUpgrade()
方法中,开发人员将遵循以下模式:
- 扔掉旧桌子
- 通过调用
onCreate()
onCreate()
方法中添加列,而不是onUpgrade()
,并使用onUpgrade()
,如下所示:
- 首先,将
中先前创建的表(table1)的表名更改为table2onCreate()
将表1重命名为表2
- 再次调用
方法来创建表(table1),并添加您选择的列名onCreate()
- 使用
将数据从旧表迁移到新表光标
- 放下那张旧桌子
- 列可能没有主键或唯一约束
- 该列可能没有默认值CURRENT_TIME、CURRENT_DATE、CURRENT_TIMESTAMP或括号中的表达式
- 如果指定了NOTNULL约束,则该列必须具有除NULL以外的默认值
- 如果启用了外键约束并添加了带有REFERENCES子句的列,则该列的默认值必须为 空
onCreate
中使用的表Create应包括新列,因为新的/增加的数据库版本将在APK中,因此不会调用onUpgrade
(它将用于现有用户,因为数据库存在,并且将具有一个/以前的版本)。但是,数据库(假设它不作为资产包含)将不存在,因此将被创建,从而导致onCreate
方法运行
额外的 如果提供一个
默认值
,则该值将用于填充所有行的列(请参见限制)。e、 g:-
结果:-
- 保留现有数据
- 添加了用默认值填充的列testadd
ALTER TABLE table ADD COLUMN column_definition
ALTER TABLE details ADD COLUMN testadd TEXT DEFAULT 'rumplestiltskin'