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()
方法添加列时,我的应用程序崩溃了。
如果我的代码有问题,请帮我纠正。
答案 0 :(得分:1)
我可以看到的一个明显错误是您正在尝试更改辅助类的onUpgrade()方法之外的数据库模式。
只能在onUpgrade()方法中更改模式,类似于只能在onCreate()中创建模式。
您必须升级您的db版本,并且应该触发您的onUpgrade()代码。处理它的正确方法取决于观点。您可以截断整个数据库并调用onCreate(),它现在将具有更改的模式,或者您可以拥有与db版本匹配并更改模式的情况。
查看此答案以获取更多详细信息:
答案 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为数字部分的前缀)。