package net.basilwang.migrations; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; public class V10Migration implements Migration { @Override public void migrate(SQLiteDatabase db) { createTableSemesters(db); updateAllCurriculums(db); // 2012-10-25 create curriculum_temp and scores_temp table with modifed // fields db.execSQL("CREATE TABLE IF NOT EXISTS scores_temp(" + "_id integer primary key autoincrement," + "coursename varchar(50)," + "coursecode varchar(20)," + "coursetype varchar(20)," + "coursebelongto varchar(20)," + /* new semesterid field */"semesterid integer," + "scorelevel number," + "scorepoint number," + "score integer," + "secondmajorflag integer," + "secondscore integer," + "thirdscore integer," + "department varchar(50)," + "memo varchar(20)," + "isthirdscore integer," + "myid integer)"); db.execSQL("CREATE TABLE IF NOT EXISTS curriculum_temp(" + "_id integer primary key autoincrement," + "name varchar(50)," + "curriculumindex integer," + "teachername varchar(20)," + /* new semesterid field */"semesterid integer," + "classroom varchar(20)," + "intervaltype varchar(20)," + "dayofweek integer," + "semesterindex varchar(20)," + "timespan integer," + "severity integer," + "myid integer," + "semesterperiod varchar(20)," + "rawinfo text )"); // 2012-10-25 copy old data to temp table // copy old score to score_temp db.execSQL("INSERT INTO scores_temp(coursename,coursecode,coursetype,coursebelongto,scorelevel," + "scorepoint,score,secondmajorflag,secondscore,thirdscore,department,memo,isthirdscore,myid,semesterid)" + "SELECT sc.coursename, sc.coursecode, sc.coursetype,sc.coursebelongto," + "sc.scorelevel, sc.scorepoint, sc.score, sc.secondmajorflag, sc.secondscore," + "sc.thirdscore, sc.department, sc.memo, sc.isthirdscore, sc.myid, se._id " + " FROM scores sc, semesters se WHERE se.semestername = " + "sc.cemesteryear || '|' || sc.cemesterindex"); // // copy old curriculum to curriculum_temp // db.execSQL("INSERT INTO curriculum_temp(name, semesterid,dayofweek," // + "timespan,myid,rawinfo)" // + // "SELECT c.name, s._id, c.dayofweek, c.timespan, c.myid, c.rawinfo FROM curriculum c, semesters s " // + "WHERE c.cemesterindex = s.semestername "); // //2012-10-25 delete curriculum and scores db.execSQL("drop table curriculum"); db.execSQL("drop table scores"); // 2012-10-25 rename curriculum_temp and scores_temp db.execSQL("ALTER TABLE scores_temp RENAME TO scores"); db.execSQL("ALTER TABLE curriculum_temp RENAME TO curriculum"); } public void createTableSemesters(SQLiteDatabase db) { // 2012-10-25 add semesters db.execSQL("CREATE TABLE IF NOT EXISTS semesters(" + "_id integer primary key autoincrement," + "semestername varchar(50)," + "beginningdate varchar(20)," + "endingdate varchar(20)," + "curriculumstatus integer," + "scorestatus integer," + "isenabled integer," + "accountid integer)"); // 2012-10-25 add some semesters String[] accounts = getAccountsId(db); if (accounts.length != 0) { String[] bindArgs = { accounts[0] }; db.execSQL("Insert INTO semesters(semestername,accountid)" + "VALUES('2009-2010|1',? )", bindArgs); db.execSQL("Insert INTO semesters(semestername,accountid)" + "VALUES('2009-2010|2',? )", bindArgs); db.execSQL("Insert INTO semesters(semestername,accountid)" + "VALUES('2010-2011|1',? )", bindArgs); db.execSQL("Insert INTO semesters(semestername,accountid)" + "VALUES('2010-2011|2',? )", bindArgs); db.execSQL("Insert INTO semesters(semestername,accountid)" + "VALUES('2011-2012|1',? )", bindArgs); db.execSQL("Insert INTO semesters(semestername,accountid)" + "VALUES('2011-2012|2',? )", bindArgs); db.execSQL( "Insert INTO semesters(semestername,accountid,beginningdate,endingdate)" + "VALUES('2012-2013|1',?,'1349096936258','1362057088994' )", bindArgs); } else { db.execSQL("Insert INTO semesters(semestername,accountid)" + "VALUES('2009-2010|1',1 )"); db.execSQL("Insert INTO semesters(semestername,accountid)" + "VALUES('2009-2010|2',1 )"); db.execSQL("Insert INTO semesters(semestername,accountid)" + "VALUES('2010-2011|1',1 )"); db.execSQL("Insert INTO semesters(semestername,accountid)" + "VALUES('2010-2011|2',1 )"); db.execSQL("Insert INTO semesters(semestername,accountid)" + "VALUES('2011-2012|1',1 )"); db.execSQL("Insert INTO semesters(semestername,accountid)" + "VALUES('2011-2012|2',1)"); db.execSQL("Insert INTO semesters(semestername,accountid,beginningdate,endingdate)" + "VALUES('2012-2013|1',1,'1349096936258','1362057088994' )"); } } /** * Because curriculum's semester's "-" is different * * @param db */ public void updateAllCurriculums(SQLiteDatabase db) { db.execSQL("UPDATE curriculum SET cemesterindex = REPLACE(cemesterindex, '–','-')"); } public String[] getAccountsId(SQLiteDatabase db) { Cursor result = db.rawQuery("SELECT * FROM accounts", null); String[] ids = new String[result.getCount()]; while (result.moveToNext()) { int i = 0; ids[i] = result.getString(result.getColumnIndex("_id")); } // 2012-11-22 basilwang don't forget to close cursor result.close(); return ids; } }