在我的Android应用程序中,我想使用以下方法向现有的数据库表添加一列

时间:2017-09-01 20:52:18

标签: android sqlite

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()方法添加列时,我的应用程序崩溃了。 如果我的代码有问题,请帮我纠正。

2 个答案:

答案 0 :(得分:1)

我可以看到的一个明显错误是您正在尝试更改辅助类的onUpgrade()方法之外的数据库模式。

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

您必须升级您的db版本,并且应该触发您的onUpgrade()代码。处理它的正确方法取决于观点。您可以截断整个数据库并调用onCreate(),它现在将具有更改的模式,或者您可以拥有与db版本匹配并更改模式的情况。

查看此答案以获取更多详细信息:

How to add new Column to Android SQLite Database?

答案 1 :(得分:0)

您似乎正在尝试添加一个名为 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为数字部分的前缀)。