package com.zulip.android.database; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.util.Log; import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper; import com.j256.ormlite.support.ConnectionSource; import com.j256.ormlite.table.TableUtils; import com.zulip.android.R; import com.zulip.android.ZulipApp; import com.zulip.android.models.Emoji; import com.zulip.android.models.Message; import com.zulip.android.models.MessageRange; import com.zulip.android.models.Person; import com.zulip.android.models.Reaction; import com.zulip.android.models.Stream; import com.zulip.android.models.UserReaction; import com.zulip.android.util.MD5Util; import java.sql.SQLException; /** * Database helper class used to manage the creation and upgrading of your * database. This class also usually provides the DAOs used by the other * classes. */ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { // name of the database file for your application -- change to something // appropriate for your app private static final String DATABASE_NAME = "zulip-%s.db"; // any time you make changes to your database objects, you may have to // increase the database version private static final int DATABASE_VERSION = 11; public DatabaseHelper(ZulipApp app, String email) { super(app, String.format(DATABASE_NAME, MD5Util.md5Hex(email)), null, DATABASE_VERSION, R.raw.ormlite_config); } /** * Escape LIKE wildcards with a backslash. Must also use ESCAPE clause * * @param likeClause string to escape * @return Escaped string */ public static String likeEscape(String likeClause) { return likeClause.replace("%", "\\%").replace("_", "\\_"); } /** * This is called when the database is first created. Usually you should * call createTable statements here to create the tables that will store * your data. */ @Override public void onCreate(SQLiteDatabase db, ConnectionSource connectionSource) { try { Log.i(DatabaseHelper.class.getName(), "onCreate"); // Create the databases we're using TableUtils.createTable(connectionSource, Person.class); TableUtils.createTable(connectionSource, Stream.class); TableUtils.createTable(connectionSource, Message.class); TableUtils.createTable(connectionSource, MessageRange.class); TableUtils.createTable(connectionSource, Emoji.class); TableUtils.createTable(connectionSource, Reaction.class); TableUtils.createTable(connectionSource, UserReaction.class); } catch (SQLException e) { Log.e(DatabaseHelper.class.getName(), "Can't create database", e); throw new RuntimeException(e); } } public void resetDatabase(SQLiteDatabase db) { ZulipApp.get().onResetDatabase(); Log.i("resetDatabase", "Resetting database"); boolean inTransaction = db.inTransaction(); if (!inTransaction) { db.beginTransaction(); } Cursor c = db.rawQuery( "SELECT name FROM sqlite_master WHERE type='table'" + "AND name NOT LIKE 'sqlite_%'" + "AND name NOT LIKE 'android_%';", null); while (c.moveToNext()) { String name = c.getString(0); Log.i("resetDatabase", "Dropping " + name); db.execSQL("DROP TABLE " + name); } c.close(); db.setTransactionSuccessful(); db.endTransaction(); db.execSQL("VACUUM;"); if (inTransaction) { db.beginTransaction(); } onCreate(db); } /** * This is called when your application is upgraded and it has a higher * version number. This allows you to adjust the various data to match the * new version number. */ @Override public void onUpgrade(SQLiteDatabase db, ConnectionSource connectionSource, int oldVersion, int newVersion) { resetDatabase(db); } @Override public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { resetDatabase(db); } }