使用sqlite更改数据库的结构

时间:2018-02-08 06:18:23

标签: android sqlite

我的应用程序已经在市场上了我想要在表中添加一个额外的列,因为我研究了我发现onUpgrade()方法,其中我可以使用ALTER TABLE添加该列并增加我的数据库版本但是混淆是这个当用户获得更新应用程序的通知时,工作时不会丢失任何先前的数据,如果是,那么如果新用户第一次安装应用程序,那么这个onUpgrade()方法将对他们有用,列将被添加或仅onCreate()方法适用于它们。

3 个答案:

答案 0 :(得分:1)

  

这样可以在用户获取时不会丢失任何先前的数据   更新申请的通知?

ALTER TABLE table ADD COLUMN column_definition

将列添加到表中,即保留现有数据(参见下面的附加示例)。

但是,有一些限制: -

  

ADD COLUMN语法用于向现有列添加新列   表。

     

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

     

column-def规则定义了。的特征   新专栏。

     

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

     
      
  • 该列可能没有PRIMARY KEY或UNIQUE约束。

  •   
  • 该列的默认值可能不是CURRENT_TIME,CURRENT_DATE,CURRENT_TIMESTAMP或括号中的表达式。

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

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

  •   
     

另请注意,添加CHECK约束时,CHECK约束为   未针对表中预先存在的行进行测试。这可能导致a   包含违反CHECK约束的数据的表。   SQLite的未来版本可能会更改以验证CHECK约束   因为他们被添加。

     

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

     

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

来自ALTER TABLE

  

如果新用户第一次安装应用程序,那该怎么办?   这个onUpgrade()方法是否适用于列   添加或仅onCreate()方法适用于它们?

为了迎合新用户,onCreate中使用的表格创建应该包含新列,因为新的/增加的数据库版本将在APK中,因此onUpgrade将不会被调用(它将是对于现有用户,因为数据库存在并且将具有/先前版本)。但是,数据库(假设它不作为资产包含)将不存在并因此被创建,从而导致onCreate方法运行。

附加

如果您提供DEFAULT,则该值将用于填充所有行的列(请参阅限制)。例如: -

ALTER TABLE details ADD COLUMN testadd TEXT DEFAULT 'rumplestiltskin'

导致: -

enter image description here

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

答案 1 :(得分:0)

您只需为每个版本添加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);
    }
}

答案 2 :(得分:0)

通常,在onUpgrade()方法中,开发人员会遵循以下模式:

  • 删除旧表
  • 致电onCreate()
  • 创建新表格

对于您的问题,我建议您使用onCreate()方法而不是onUpgrade()添加列,并使用onUpgrade(),如下所示:

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

    ALTER TABLE table1 RENAME TO table2

  • 再次调用onCreate()方法创建表(table1),其中添加了您选择的列名。

  • 使用Cursor将数据从旧表迁移到新表。
  • 放下旧桌子。

更改数据库版本以升级表格。