/* * Copyright 2010 Arthur Zaczek <arthur@dasz.at>, dasz.at OG; All rights reserved. * Copyright 2010 David Schmitt <david@dasz.at>, dasz.at OG; All rights reserved. * * This file is part of Kolab Sync for Android. * Kolab Sync for Android is free software: you can redistribute it * and/or modify it under the terms of the GNU General Public License * as published by the Free Software Foundation, either version 3 of * the License, or (at your option) any later version. * Kolab Sync for Android is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * You should have received a copy of the GNU General Public License * along with Kolab Sync for Android. * If not, see <http://www.gnu.org/licenses/>. */ package at.dasz.KolabDroid.Provider; import android.content.Context; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; import at.dasz.KolabDroid.Utils; /** * @author arthur * */ public class DatabaseHelper extends SQLiteOpenHelper { private final static String DATABASE_NAME = "KolabDroid.db"; private final static int DATABASE_VERSION = 7; public final static String COL_ID = "_id"; public final static int COL_IDX_ID = 0; public static final String[] ID_PROJECTION = new String[] { COL_ID }; /** * @param context */ DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { createDb(db); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // sync-info if (oldVersion != newVersion) { Log.i("Database", "Upgrading Database from " + oldVersion + " to " + newVersion); if(oldVersion < 4) { // Old development version, no upgrade path dropDb(db); createDb(db); } if(oldVersion == 4) { // Add alter statements for version upgrade 4 to 5 // Add error message column db.execSQL("ALTER TABLE " + StatusProvider.STATUS_TABLE_NAME + " ADD " + StatusProvider.COL_fatalErrorMsg + " TEXT"); // skip version 5, which only contains a patch for DBs that were wrongly created with version 5 but a v4 schema oldVersion = 6; } if(oldVersion == 5) { // Add alter statements for version upgrade 5 to 6 try { // retry adding the error message column. This should fix // already installed broken databases. db.execSQL("ALTER TABLE " + StatusProvider.STATUS_TABLE_NAME + " ADD " + StatusProvider.COL_fatalErrorMsg + " TEXT"); } catch (SQLException ex) { // ignore } // Next version, continue upgrade oldVersion = 6; } if(oldVersion == 6) { // Add alter statements for version upgrade 6 to 7 dropDb(db); createDb(db); // Next version, continue upgrade oldVersion = 7; } } else { Log.i("Database", "No need to upgrade Database"); } } private void createDb(SQLiteDatabase db) { final String columns = Utils.join(", ", new String[] { COL_ID + " INTEGER PRIMARY KEY", LocalCacheProvider.COL_LOCAL_ID + " INTEGER UNIQUE", LocalCacheProvider.COL_LOCAL_HASH + " TEXT", LocalCacheProvider.COL_REMOTE_ID + " TEXT UNIQUE", LocalCacheProvider.COL_REMOTE_IMAP_UID + " TEXT", LocalCacheProvider.COL_REMOTE_CHANGEDDATE + " INTEGER", LocalCacheProvider.COL_REMOTE_SIZE + " INTEGER", LocalCacheProvider.COL_REMOTE_HASH + " BLOB"}); db.execSQL("CREATE TABLE " + LocalCacheProvider.CONTACT_TABLE_NAME + " (" + columns + ");"); db.execSQL("CREATE TABLE " + LocalCacheProvider.CALENDAR_TABLE_NAME + " (" + columns + ");"); final String stat_columns = Utils.join(", ", new String[] { COL_ID + " INTEGER PRIMARY KEY", StatusProvider.COL_time + " INTEGER", StatusProvider.COL_task + " TEXT", StatusProvider.COL_items + " INTEGER", StatusProvider.COL_localChanged + " INTEGER", StatusProvider.COL_remoteChanged + " INTEGER", StatusProvider.COL_localNew + " INTEGER", StatusProvider.COL_remoteNew + " INTEGER", StatusProvider.COL_localDeleted + " INTEGER", StatusProvider.COL_remoteDeleted + " INTEGER", StatusProvider.COL_conflicted + " INTEGER", StatusProvider.COL_errors + " INTEGER", StatusProvider.COL_fatalErrorMsg + " TEXT",}); db.execSQL("CREATE TABLE " + StatusProvider.STATUS_TABLE_NAME + " (" + stat_columns + ");"); } private void dropDb(SQLiteDatabase db) { db.execSQL("DROP TABLE IF EXISTS " + LocalCacheProvider.CONTACT_TABLE_NAME); db.execSQL("DROP TABLE IF EXISTS " + LocalCacheProvider.CALENDAR_TABLE_NAME); db.execSQL("DROP TABLE IF EXISTS " + StatusProvider.STATUS_TABLE_NAME); } public void cleanDb(SQLiteDatabase db) { db.execSQL("DELETE FROM " + LocalCacheProvider.CONTACT_TABLE_NAME); db.execSQL("DELETE FROM " + LocalCacheProvider.CALENDAR_TABLE_NAME); db.execSQL("DELETE FROM " + StatusProvider.STATUS_TABLE_NAME); } }