package com.quickblox.q_municate_db.utils; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.util.Log; import com.j256.ormlite.support.ConnectionSource; import com.j256.ormlite.table.TableUtils; import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class DbHelperUtils { private static final String TAG = DbHelperUtils.class.getSimpleName(); public static final String TABLES_QUERY = "SELECT name FROM sqlite_master WHERE type='table'"; public static final String DROP_QUERY = "DROP TABLE "; private static final List<String> SERVICE_TABLES = Arrays.asList("sqlite_sequence", "android_metadata"); public static List<String> getTables(Cursor cursor) { List<String> tables = new ArrayList<>(cursor.getCount()); for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { String table = cursor.getString(0); if (!SERVICE_TABLES.contains(table)) { tables.add(table); } } return tables; } public static void onCreate(ConnectionSource connectionSource, Class<?>[] tables) { try { for (Class clazz : tables) { TableUtils.createTable(connectionSource, clazz); } } catch (SQLException e) { ErrorUtils.logError(e); } } public static void onOpen(SQLiteDatabase db) { if (!db.isReadOnly()) { // Enable foreign key constraints db.execSQL("PRAGMA foreign_keys=ON;"); } } public static void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, Class<?>[] tablesClasses) { try { Cursor c = database.rawQuery(DbHelperUtils.TABLES_QUERY, null); List<String> tables = DbHelperUtils.getTables(c); c.close(); database.beginTransaction(); try { for (String t : tables) { try { database.execSQL(DbHelperUtils.DROP_QUERY + t); Log.d(TAG, "Drop table " + t); } catch (Exception e) { Log.e(TAG, "Error while dropping table " + t, e); } } onCreate(connectionSource, tablesClasses); database.setTransactionSuccessful(); } finally { database.endTransaction(); } } catch (Exception e) { ErrorUtils.logError(e); } } public static void clearTable(ConnectionSource connectionSource, Class clazz) { try { TableUtils.clearTable(connectionSource, clazz); } catch (SQLException e) { ErrorUtils.logError(e); } } public static void clearTables(ConnectionSource connectionSource, Class<?>[] tables) { for (Class clazz : tables) { clearTable(connectionSource, clazz); } } }