Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/179.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用sqlite更改数据库结构_Android_Sqlite - Fatal编程技术网

Android 使用sqlite更改数据库结构

Android 使用sqlite更改数据库结构,android,sqlite,Android,Sqlite,我的应用程序已经上市了,现在我想在表中添加一个额外的列,在我研究的过程中,我发现了onUpgrade()方法,在该方法中,我可以使用ALTER table添加该列,并增加我的数据库版本,但混淆的是,当用户收到更新应用程序的通知时,该方法是否可以在不丢失任何以前的数据的情况下工作,如果是,那么,如果新用户第一次安装应用程序,这个onUpgrade()方法对他们有效吗?该列将被添加,或者只有onCreate()方法对他们有效。您只需为每个版本添加if语句 @Override public void

我的应用程序已经上市了,现在我想在表中添加一个额外的列,在我研究的过程中,我发现了onUpgrade()方法,在该方法中,我可以使用ALTER table添加该列,并增加我的数据库版本,但混淆的是,当用户收到更新应用程序的通知时,该方法是否可以在不丢失任何以前的数据的情况下工作,如果是,那么,如果新用户第一次安装应用程序,这个onUpgrade()方法对他们有效吗?该列将被添加,或者只有onCreate()方法对他们有效。

您只需为每个版本添加if语句

@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()
,如下所示:

  • 首先,将
    onCreate()
    中先前创建的表(table1)的表名更改为table2

    将表1重命名为表2

  • 再次调用
    onCreate()
    方法来创建表(table1),并添加您选择的列名

  • 使用
    光标
    将数据从旧表迁移到新表
  • 放下那张旧桌子
更改数据库版本以升级表

当用户获得 更新应用程序的通知?

将列按原样添加到表中,即保留现有数据(示例请参见下面的“附加”)

但是,有以下限制:-

添加列语法用于将新列添加到现有列 桌子

新列始终附加到列表的末尾 现有列

列定义规则定义了 新专栏

新栏可以采用任何允许的形式 在CREATE TABLE语句中,具有以下限制:

  • 列可能没有主键或唯一约束

  • 该列可能没有默认值CURRENT_TIME、CURRENT_DATE、CURRENT_TIMESTAMP或括号中的表达式

  • 如果指定了NOTNULL约束,则该列必须具有除NULL以外的默认值

  • 如果启用了外键约束并添加了带有REFERENCES子句的列,则该列的默认值必须为 空

还要注意,添加检查约束时,检查约束为 未针对表中预先存在的行进行测试。这可能会导致 包含违反检查约束的数据的表。 SQLite的未来版本可能会更改以验证检查约束 当它们被添加时

ALTER TABLE命令的执行时间独立于 表中的数据量。ALTERTABLE命令运行得同样快 在一个有1000万行的表上,就像在一个有1行的表上一样

在数据库上运行ADD COLUMN后,该数据库将不会被删除 可由SQLite版本3.1.3(2005-02-20)及更早版本读取

如果新用户第一次安装应用程序,他们会怎么办 这个onUpgrade()方法对他们有效吗 添加的或仅onCreate()方法适用于它们?

为满足新用户的需要,在
onCreate
中使用的表Create应包括新列,因为新的/增加的数据库版本将在APK中,因此不会调用
onUpgrade
(它将用于现有用户,因为数据库存在,并且将具有一个/以前的版本)。但是,数据库(假设它不作为资产包含)将不存在,因此将被创建,从而导致
onCreate
方法运行


额外的 如果提供一个
默认值
,则该值将用于填充所有行的列(请参见限制)。e、 g:-

结果:-

  • 保留现有数据
  • 添加了用默认值填充的列testadd

使用房间图书馆。。。它有这样的设施。if(newversion==21){sqLiteDatabase.execSQL(“altertable list ADD Column like”);}和在创建databasedb.execSQL(“create TABLE list(COL_A,COL_B,like))时5944在创建databasedb.execSql(“创建表列表(COL_A,COL_B,like);……它会工作吗???原则上是的
ALTER TABLE table ADD COLUMN column_definition
ALTER TABLE details ADD COLUMN testadd TEXT DEFAULT 'rumplestiltskin'