package com.nuscomputing.ivle; import com.nuscomputing.ivle.providers.AnnouncementsContract; import com.nuscomputing.ivle.providers.GradebookItemsContract; import com.nuscomputing.ivle.providers.GradebooksContract; import com.nuscomputing.ivle.providers.ModulesContract; import com.nuscomputing.ivle.providers.TimetableSlotsContract; import com.nuscomputing.ivle.providers.UsersContract; import com.nuscomputing.ivle.providers.WebcastFilesContract; import com.nuscomputing.ivle.providers.WebcastItemGroupsContract; import com.nuscomputing.ivle.providers.WebcastsContract; import com.nuscomputing.ivle.providers.WeblinksContract; import com.nuscomputing.ivle.providers.WorkbinFilesContract; import com.nuscomputing.ivle.providers.WorkbinFoldersContract; import com.nuscomputing.ivle.providers.WorkbinsContract; import android.accounts.Account; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; /** * Provides a storage for the IVLE app. * Used to store accounts and various miscellaneous IVLE-related data. * @author yjwong */ public class DatabaseHelper extends SQLiteOpenHelper { // {{{ properties /** Version of the database schema */ private static final int DATABASE_VERSION = 17; /** Name of this database */ private static final String DATABASE_NAME = "ivle"; /** The context */ private Context mContext; /** Data for announcements data table */ public static final String ANNOUNCEMENTS_TABLE_NAME = "announcements"; private static final String ANNOUNCEMENTS_TABLE_CREATE = "CREATE TABLE " + ANNOUNCEMENTS_TABLE_NAME + "(" + AnnouncementsContract.ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + AnnouncementsContract.IVLE_ID + " TEXT, " + AnnouncementsContract.MODULE_ID + " TEXT, " + AnnouncementsContract.CREATOR_ID + " TEXT, " + AnnouncementsContract.ACCOUNT + " TEXT, " + AnnouncementsContract.TITLE + " TEXT, " + AnnouncementsContract.DESCRIPTION + " TEXT, " + AnnouncementsContract._DESCRIPTION_NOHTML + " TEXT, " + AnnouncementsContract.CREATED_DATE + " DATETIME, " + AnnouncementsContract.EXPIRY_DATE + " DATETIME, " + AnnouncementsContract.URL + " TEXT, " + AnnouncementsContract.IS_READ + " BOOLEAN" + ");"; /** Data for modules data table */ public static final String MODULES_TABLE_NAME = "modules"; private static final String MODULES_TABLE_CREATE = "CREATE TABLE " + MODULES_TABLE_NAME + "(" + ModulesContract.ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + ModulesContract.IVLE_ID + " TEXT, " + ModulesContract.ACCOUNT + " TEXT, " + ModulesContract.CREATOR_ID + " TEXT, " + ModulesContract.BADGE + " INTEGER, " + ModulesContract.BADGE_ANNOUNCEMENT + " INTEGER, " + ModulesContract.COURSE_ACAD_YEAR + " TEXT, " + ModulesContract.COURSE_CLOSE_DATE + " DATETIME," + ModulesContract.COURSE_CODE + " TEXT, " + ModulesContract.COURSE_DEPARTMENT + " TEXT, " + ModulesContract.COURSE_LEVEL + " INTEGER, " + ModulesContract.COURSE_MC + " INTEGER, " + ModulesContract.COURSE_NAME + " TEXT, " + ModulesContract.COURSE_OPEN_DATE + " DATETIME, " + ModulesContract.COURSE_SEMESTER + " TEXT, " + ModulesContract.HAS_ANNOUNCEMENT_ITEMS + " BOOLEAN, " + ModulesContract.HAS_CLASS_GROUPS_FOR_SIGN_UP + " BOOLEAN, " + ModulesContract.HAS_CLASS_ROSTER_ITEMS + " BOOLEAN, " + ModulesContract.HAS_CONSULTATION_ITEMS + " BOOLEAN, " + ModulesContract.HAS_CONSULTATION_SLOTS_FOR_SIGN_UP + " BOOLEAN, " + ModulesContract.HAS_DESCRIPTION_ITEMS + " BOOLEAN, " + ModulesContract.HAS_GRADEBOOK_ITEMS + " BOOLEAN, " + ModulesContract.HAS_GROUPS_ITEMS + " BOOLEAN, " + ModulesContract.HAS_GUEST_ROSTER_ITEMS + " BOOLEAN, " + ModulesContract.HAS_LECTURER_ITEMS + " BOOLEAN, " + ModulesContract.HAS_PROJECT_GROUP_ITEMS + " BOOLEAN, " + ModulesContract.HAS_PROJECT_GROUPS_FOR_SIGN_UP + " BOOLEAN, " + ModulesContract.HAS_READING_ITEMS + " BOOLEAN, " + ModulesContract.HAS_TIMETABLE_ITEMS + " BOOLEAN, " + ModulesContract.HAS_WEBLINK_ITEMS + " BOOLEAN, " + ModulesContract.IS_ACTIVE + " BOOLEAN, " + ModulesContract.PERMISSION + " TEXT" + ");"; /** Data for gradebooks data table */ public static final String GRADEBOOKS_TABLE_NAME = "gradebook"; private static final String GRADEBOOKS_TABLE_CREATE = "CREATE TABLE " + GRADEBOOKS_TABLE_NAME + "(" + GradebooksContract.ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + GradebooksContract.IVLE_ID + " TEXT, " + GradebooksContract.MODULE_ID + " TEXT, " + GradebooksContract.ACCOUNT + " TEXT, " + GradebooksContract.CATEGORY_TITLE + " TEXT" + ");"; /** Data for gradebook items data table */ public static final String GRADEBOOK_ITEMS_TABLE_NAME = "gradebook_items"; private static final String GRADEBOOK_ITEMS_TABLE_CREATE = "CREATE TABLE " + GRADEBOOK_ITEMS_TABLE_NAME + "(" + GradebookItemsContract.ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + GradebookItemsContract.IVLE_ID + " TEXT, " + GradebookItemsContract.MODULE_ID + " TEXT, " + GradebookItemsContract.GRADEBOOK_ID + " TEXT, " + GradebookItemsContract.ACCOUNT + " TEXT, " + GradebookItemsContract.AVERAGE_MEDIAN_MARKS + " TEXT, " + GradebookItemsContract.DATE_ENTERED + " TEXT, " + GradebookItemsContract.HIGHEST_LOWEST_MARKS + " TEXT, " + GradebookItemsContract.ITEM_DESCRIPTION + " TEXT, " + GradebookItemsContract.ITEM_NAME + " TEXT, " + GradebookItemsContract.MARKS_OBTAINED + " TEXT, " + GradebookItemsContract.MAX_MARKS + " INTEGER, " + GradebookItemsContract.PERCENTILE + " TEXT, " + GradebookItemsContract.REMARK + " TEXT" + ");"; /** Data for timetable slots table */ public static final String TIMETABLE_SLOTS_TABLE_NAME = "timetable_slots"; private static final String TIMETABLE_SLOTS_TABLE_CREATE = "CREATE TABLE " + TIMETABLE_SLOTS_TABLE_NAME + "(" + TimetableSlotsContract.ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + TimetableSlotsContract.MODULE_ID + " TEXT, " + TimetableSlotsContract.ACCOUNT + " TEXT, " + TimetableSlotsContract.ACAD_YEAR + " TEXT, " + TimetableSlotsContract.SEMESTER + " TEXT, " + TimetableSlotsContract.START_TIME + " TEXT, " + TimetableSlotsContract.END_TIME + " TEXT, " + TimetableSlotsContract.MODULE_CODE + " TEXT, " + TimetableSlotsContract.CLASS_NO + " TEXT, " + TimetableSlotsContract.LESSON_TYPE + " TEXT, " + TimetableSlotsContract.VENUE + " TEXT, " + TimetableSlotsContract.DAY_CODE + " TEXT, " + TimetableSlotsContract.DAY_TEXT + " TEXT, " + TimetableSlotsContract.WEEK_CODE + " TEXT, " + TimetableSlotsContract.WEEK_TEXT + " TEXT" + ");"; /** Data for users data table */ public static final String USERS_TABLE_NAME = "users"; private static final String USERS_TABLE_CREATE = "CREATE TABLE " + USERS_TABLE_NAME + "(" + UsersContract.ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + UsersContract.IVLE_ID + " TEXT, " + UsersContract.ACCOUNT + " TEXT, " + UsersContract.ACCOUNT_TYPE + " TEXT, " + UsersContract.EMAIL + " TEXT, " + UsersContract.NAME + " TEXT, " + UsersContract.TITLE + " TEXT, " + UsersContract.USER_ID + " TEXT" + ");"; /** Data for webcasts data table */ public static final String WEBCASTS_TABLE_NAME = "webcasts"; private static final String WEBCASTS_TABLE_CREATE = "CREATE TABLE " + WEBCASTS_TABLE_NAME + "(" + WebcastsContract.ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + WebcastsContract.IVLE_ID + " TEXT, " + WebcastsContract.MODULE_ID + " TEXT, " + WebcastsContract.ACCOUNT + " TEXT, " + WebcastsContract.CREATOR_ID + " TEXT, " + WebcastsContract.BADGE_TOOL + " INTEGER, " + WebcastsContract.PUBLISHED + " INTEGER, " + WebcastsContract.TITLE + " TEXT" + ");"; /** Data for webcast files table */ public static final String WEBCAST_FILES_TABLE_NAME = "webcast_files"; private static final String WEBCAST_FILES_TABLE_CREATE = "CREATE TABLE " + WEBCAST_FILES_TABLE_NAME + "(" + WebcastFilesContract.ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + WebcastFilesContract.IVLE_ID + " TEXT, " + WebcastFilesContract.MODULE_ID + " TEXT, " + WebcastFilesContract.WEBCAST_ITEM_GROUP_ID + " TEXT, " + WebcastFilesContract.ACCOUNT + " TEXT, " + WebcastFilesContract.CREATOR_ID + " TEXT, " + WebcastFilesContract.BANK_ITEM_ID + " TEXT, " + WebcastFilesContract.CREATE_DATE + " TEXT, " + WebcastFilesContract.FILE_DESCRIPTION + " TEXT, " + WebcastFilesContract.FILE_NAME + " TEXT, " + WebcastFilesContract.FILE_TITLE + " TEXT, " + WebcastFilesContract.MP3 + " TEXT, " + WebcastFilesContract.MP4 + " TEXT, " + WebcastFilesContract.MEDIA_FORMAT + " TEXT, " + WebcastFilesContract.IS_READ + " BOOLEAN" + ");"; /** Data for webcast item groups table */ public static final String WEBCAST_ITEM_GROUPS_TABLE_NAME = "webcast_item_groups"; private static final String WEBCAST_ITEM_GROUPS_TABLE_CREATE = "CREATE TABLE " + WEBCAST_ITEM_GROUPS_TABLE_NAME + "(" + WebcastItemGroupsContract.ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + WebcastItemGroupsContract.IVLE_ID + " TEXT, " + WebcastItemGroupsContract.MODULE_ID + " TEXT, " + WebcastItemGroupsContract.WEBCAST_ID + " TEXT, " + WebcastItemGroupsContract.ACCOUNT + " TEXT, " + WebcastItemGroupsContract.ITEM_GROUP_TITLE + " TEXT" + ");"; /** Data for weblinks data table */ public static final String WEBLINKS_TABLE_NAME = "weblinks"; private static final String WEBLINKS_TABLE_CREATE = "CREATE TABLE " + WEBLINKS_TABLE_NAME + "(" + WeblinksContract.ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + WeblinksContract.IVLE_ID + " TEXT, " + WeblinksContract.MODULE_ID + " TEXT, " + WeblinksContract.ACCOUNT + " TEXT, " + WeblinksContract.DESCRIPTION + " TEXT, " + WeblinksContract.ORDER + " INTEGER, " + WeblinksContract.RATING + " INTEGER, " + WeblinksContract.SITE_TYPE + " INTEGER, " + WeblinksContract.URL + " TEXT" + ");"; /** Data for workbins data table */ public static final String WORKBINS_TABLE_NAME = "workbins"; private static final String WORKBINS_TABLE_CREATE = "CREATE TABLE " + WORKBINS_TABLE_NAME + "(" + WorkbinsContract.ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + WorkbinsContract.IVLE_ID + " TEXT, " + WorkbinsContract.MODULE_ID + " TEXT, " + WorkbinsContract.ACCOUNT + " TEXT, " + WorkbinsContract.CREATOR_ID + " TEXT, " + WorkbinsContract.BADGE_TOOL + " INTEGER, " + WorkbinsContract.PUBLISHED + " BOOLEAN, " + WorkbinsContract.TITLE + " TEXT" + ");"; /** Data for workbin folders data table */ public static final String WORKBIN_FOLDERS_TABLE_NAME = "workbin_folders"; private static final String WORKBIN_FOLDERS_TABLE_CREATE = "CREATE TABLE " + WORKBIN_FOLDERS_TABLE_NAME + "(" + WorkbinFoldersContract.ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + WorkbinFoldersContract.IVLE_ID + " TEXT, " + WorkbinFoldersContract.MODULE_ID + " TEXT, " + WorkbinFoldersContract.ACCOUNT + " TEXT, " + WorkbinFoldersContract.WORKBIN_ID + " TEXT, " + WorkbinFoldersContract.WORKBIN_FOLDER_ID + " TEXT, " + WorkbinFoldersContract.ALLOW_UPLOAD + " BOOLEAN, " + WorkbinFoldersContract.ALLOW_VIEW + " BOOLEAN, " + WorkbinFoldersContract.CLOSE_DATE + " TEXT, " + WorkbinFoldersContract.COMMENT_OPTION + " TEXT, " + WorkbinFoldersContract.FILE_COUNT + " INTEGER, " + WorkbinFoldersContract.FOLDER_NAME + " TEXT, " + WorkbinFoldersContract.ORDER + " INTEGER, " + WorkbinFoldersContract.OPEN_DATE + " TEXT, " + WorkbinFoldersContract.SORT_FILES_BY + " TEXT, " + WorkbinFoldersContract.UPLOAD_DISPLAY_OPTION + " TEXT" + ");"; /** Data for workbin files data table */ public static final String WORKBIN_FILES_TABLE_NAME = "workbin_files"; private static final String WORKBIN_FILES_TABLE_CREATE = "CREATE TABLE " + WORKBIN_FILES_TABLE_NAME + "(" + WorkbinFilesContract.ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + WorkbinFilesContract.IVLE_ID + " TEXT, " + WorkbinFilesContract.MODULE_ID + " TEXT, " + WorkbinFilesContract.ACCOUNT + " TEXT, " + WorkbinFilesContract.WORKBIN_FOLDER_ID + " TEXT, " + WorkbinFilesContract.CREATOR_ID + " TEXT, " + WorkbinFilesContract.COMMENTER_ID + " TEXT, " + WorkbinFilesContract.FILE_DESCRIPTION + " TEXT, " + WorkbinFilesContract.FILE_NAME + " TEXT, " + WorkbinFilesContract.FILE_REMARKS + " TEXT, " + WorkbinFilesContract.FILE_REMARKS_ATTACHMENT + " TEXT, " + WorkbinFilesContract.FILE_SIZE + " DOUBLE, " + WorkbinFilesContract.FILE_TYPE + " TEXT, " + WorkbinFilesContract.IS_DOWNLOADED + " BOOLEAN," + WorkbinFilesContract.DOWNLOAD_URL + " TEXT" + ");"; // }}} // {{{ methods /** * Class constructor. * Calls the super constructor to initialize this class. * * @param context */ public DatabaseHelper(Context context) { super(context, DatabaseHelper.DATABASE_NAME, null, DatabaseHelper.DATABASE_VERSION); mContext = context; } /** * Method: drop * Drops the entire table. */ public static void drop(SQLiteDatabase db, String table) { db.execSQL("DROP TABLE IF EXISTS " + table); } /** * Method: onCreate * Called when the database is created for the first time. * This is where the creation of tables and the initial population of the * tables should happen. * * @param db */ @Override public void onCreate(SQLiteDatabase db) { db.execSQL(ANNOUNCEMENTS_TABLE_CREATE); db.execSQL(GRADEBOOKS_TABLE_CREATE); db.execSQL(GRADEBOOK_ITEMS_TABLE_CREATE); db.execSQL(TIMETABLE_SLOTS_TABLE_CREATE); db.execSQL(MODULES_TABLE_CREATE); db.execSQL(USERS_TABLE_CREATE); db.execSQL(WEBCASTS_TABLE_CREATE); db.execSQL(WEBCAST_FILES_TABLE_CREATE); db.execSQL(WEBCAST_ITEM_GROUPS_TABLE_CREATE); db.execSQL(WEBLINKS_TABLE_CREATE); db.execSQL(WORKBINS_TABLE_CREATE); db.execSQL(WORKBIN_FOLDERS_TABLE_CREATE); db.execSQL(WORKBIN_FILES_TABLE_CREATE); } /** * Method: onUpgrade * Called when the database needs to be upgraded. * This should drop tables, add tables, or do anything else it needs to * upgrade to the new schema version. */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // This is a very rudimentary implementation. DatabaseHelper.drop(db, ANNOUNCEMENTS_TABLE_NAME); DatabaseHelper.drop(db, GRADEBOOKS_TABLE_NAME); DatabaseHelper.drop(db, GRADEBOOK_ITEMS_TABLE_NAME); DatabaseHelper.drop(db, TIMETABLE_SLOTS_TABLE_NAME); DatabaseHelper.drop(db, MODULES_TABLE_NAME); DatabaseHelper.drop(db, USERS_TABLE_NAME); DatabaseHelper.drop(db, WEBCASTS_TABLE_NAME); DatabaseHelper.drop(db, WEBCAST_FILES_TABLE_NAME); DatabaseHelper.drop(db, WEBCAST_ITEM_GROUPS_TABLE_NAME); DatabaseHelper.drop(db, WEBLINKS_TABLE_NAME); DatabaseHelper.drop(db, WORKBINS_TABLE_NAME); DatabaseHelper.drop(db, WORKBIN_FOLDERS_TABLE_NAME); DatabaseHelper.drop(db, WORKBIN_FILES_TABLE_NAME); // Recreate databases. this.onCreate(db); // Re-sync the databases. Account[] accounts = AccountUtils.getAllAccounts(mContext); for (Account account : accounts) { IVLEUtils.requestSyncNow(account); } return; } // }}} }