【问题标题】:In my android app I want to add a column to existing table of database using following method [duplicate]在我的 android 应用程序中,我想使用以下方法向现有数据库表添加一列 [重复]
【发布时间】:2017-09-01 20:52:17
【问题描述】:
public void addcolumn(String year,String period){


    //Create column name here

    Calendar now = Calendar.getInstance();
    int yeara = now.get(Calendar.YEAR);
    int month = now.get(Calendar.MONTH) + 1;
    int day = now.get(Calendar.DAY_OF_MONTH);

    //select period according to current time

    String colnew = ""+yeara+"_"+month+"_"+day+"_"+period;
    SQLiteDatabase db = this.getWritableDatabase();
    String exec;



    //Add column in table according to given year
    //

    if (year.equals("First Year")) {
        exec="ALTER TABLE "+ table_name1+" ADD COLUMN "+colnew+" INTEGER NOT NULL DEFAULT 0";
        db.execSQL(exec);

    }
    else if (year.equals("Second Year")) {
        db.execSQL("ALTER TABLE "+ table_name2+" ADD COLUMN "+colnew+" INTEGER NOT NULL  DEFAULT 0");

    }
    else if (year.equals("Third Year")) {
        db.execSQL("ALTER TABLE "+ table_name3+" ADD COLUMN "+colnew+" INTEGER NOT NULL  DEFAULT 0");

    }
    else if (year.equals("Fourth Year")) {
        db.execSQL("ALTER TABLE "+ table_name4+" ADD COLUMN "+colnew+" INTEGER NOT NULL  DEFAULT 0");

    }


}

但是当我尝试使用 addcolumn() 方法添加列时,我的应用程序崩溃了。 如果我的代码有问题,请帮我纠正。

【问题讨论】:

  • “我的应用程序崩溃” - 请发布您的 LogCat 输出
  • LogCat 输出 ??
  • 如果我在注释后运行代码:
  • 将您的手机连接到您的电脑... 在您的手机中启用 USB 调试。 android studio的左下角有一个小标签...有一个监视器标签,您将在其中获取日志输出和所有崩溃等内容...崩溃后立即断开手机并滚动以查找崩溃详细信息.. . 请把它们贴在这里

标签: android sqlite


【解决方案1】:

我可以看到的一个明显错误是您试图在帮助程序类的 onUpgrade() 方法之外更改数据库架构。

模式只能在 onUpgrade() 方法中更改,类似于只能在 onCreate() 中创建模式。

您必须升级您的数据库版本,这应该会触发您的 onUpgrade() 代码。处理它的正确方法取决于视角。您可以截断整个数据库并调用 onCreate(),它现在将具有更改的架构,或者您可以拥有与数据库版本匹配的案例并更改架构。

查看此答案了解更多详情:

How to add new Column to Android SQLite Database?

【讨论】:

  • 辅助类的onupgrade方法中是否需要使用'alter table' sqlite命令?
  • 谁能给我一个例子如何调用onupgrade()方法。
  • 我在我的答案中指定了一个链接。请查看它以获取 onUpgrade() 的示例。是的,在 onCreate() 或 onUpgrade() 中必须有 alter 语句或任何 DDL 命令
  • @Kushan Schemas/Database 结构可以在onUpgrade 之外更改,onCreate 这些基本上都是方便的方法。
【解决方案2】:

您似乎正在尝试添加一个名为 20170901 的列,例如您的 ALTER 语句类似于 ALTER TABLE youtablename ADD COLUMN 20170901 INTEGER NOT NULL DEFAULT 0

这将导致失败,因为 SQL 会将数字视为数字而不是字符串,并抱怨如下:-

SQLiteManager: Likely SQL syntax error: ALTER TABLE log ADD COLUMN 2020 INTEGER NOT NULL DEFAULT 0  [ near "2020": syntax error ] Exception Name: NS_ERROR_FAILURE Exception Message: Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [mozIStorageConnection.createStatement]

您可以使用ALTER TABLE log ADD COLUMN '20170901' INTEGER NOT NULL DEFAULT 0 表示一个字符串(即将数字括在引号中。单引号或双引号)。

您也可以使用非数字前缀,例如ALTER TABLE youtablename ADD COLUMN Y20170901 INTEGER NOT NULL DEFAULT 0(即 Y 前缀数字部分)。

【讨论】:

  • 我可以故意从其他类调用'onupgrade()'方法吗?
  • 我的意思是dbhelper类的'onupgrade()'方法。
  • 是的,理论上,像onUpgrade经常用来调用onCreate。但是,我不确定您是否希望/需要就好像您使用替代方法/方法那样,然后您会调用它。
  • @AshwiniKumar,我不使用onUpgrade,而是使用我自己的类(例如DBColumn、DBTable、DBDatabase)来定义一个必需/想要的 schema 并在我调用的onExpand 方法中经常有方法actionBuildSQL(将添加任何不在实际模式中的表)和actionAlterSQL(添加列)。我在 github 上有这些 Mike-j-t/Modules,注意到这些确实在 GitHub 上作为我自己的备份(所以没有真正维护得那么好)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-07
  • 1970-01-01
  • 2015-11-15
  • 1970-01-01
相关资源
最近更新 更多