package com.asp.radiorake; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteException; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; import com.asp.radiorake.utils.DateUtils; import com.asp.radiorake.utils.StringUtils; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class DatabaseHelper extends SQLiteOpenHelper { private static final String DB_NAME = "db"; private SQLiteDatabase myDataBase; private final Context myContext; public static final String FAVOURITES_TABLE = "stations"; public static final String FAVOURITES_ID = "_id"; public static final String FAVOURITES_NAME = "name"; public static final String FAVOURITES_URL = "url"; public static final String RECORDING_TYPES_TABLE = "recording_type"; public static final String RECORDING_TYPES_ID = "_id"; public static final String RECORDING_TYPES_TYPE = "type"; public static final String STATIONS_TABLE = "stations"; public static final String STATIONS_NAME = "name"; public static final String STATIONS_URL = "url"; private static final String SCHEDULED_RECORDINGS_TABLE = "recording_schedule"; private static final String SCHEDULED_RECORDINGS_ID = "_id"; public static final String SCHEDULED_RECORDINGS_START_TIME = "start_time"; public static final String SCHEDULED_RECORDINGS_END_TIME = "end_time"; public static final String SCHEDULED_RECORDINGS_STATION = "station"; public static final String SCHEDULED_RECORDINGS_TYPE = "type"; private static final String TAG = "com.asp.radiorake.DatabaseHelper"; public DatabaseHelper(Context context) { super(context, DB_NAME, null, 1); this.myContext = context; } // Creates a empty database on the system and rewrites it with your own database. private void createDataBase() throws IOException { boolean dbExist = checkDataBase(); if (dbExist) { //do nothing - database already exist } else { //By calling this method and empty database will be created into the default system path //of your application so we are gonna be able to overwrite that database with our database. this.getReadableDatabase(); try { copyDataBase(); } catch (IOException e) { throw new Error("Error copying database - " + e.getMessage()); } } } // Check if the database already exist to avoid re-copying the file each time you open the application. private boolean checkDataBase() { SQLiteDatabase checkDB = null; try { String myDB = myContext.getDatabasePath(DB_NAME).toString(); checkDB = SQLiteDatabase.openDatabase(myDB, null, SQLiteDatabase.OPEN_READONLY); } catch (SQLiteException e) { Log.e(TAG, "SQLException occurred in checkDataBase()", e); } if (checkDB != null) { checkDB.close(); } return checkDB != null; } // Copies your database from your local assets-folder to the just created empty database in the // system folder, from where it can be accessed and handled.This is done by transfering bytestream. private void copyDataBase() throws IOException { //Open your local db as the input stream InputStream myInput = myContext.getAssets().open(DB_NAME); // Path to the just created empty db String outFileName = myContext.getDatabasePath(DB_NAME).toString(); //Open the empty db as the output stream OutputStream myOutput = new FileOutputStream(outFileName); //transfer bytes from the inputfile to the outputfile byte[] buffer = new byte[1024]; int length; while ((length = myInput.read(buffer)) > 0) { myOutput.write(buffer, 0, length); } //Close the streams myOutput.flush(); myOutput.close(); myInput.close(); } public void openDataBase() throws IOException { //Open the database createDataBase(); String myDB = myContext.getDatabasePath(DB_NAME).toString(); myDataBase = SQLiteDatabase.openDatabase(myDB, null, SQLiteDatabase.OPEN_READWRITE); } @Override public synchronized void close() { if (myDataBase != null) myDataBase.close(); super.close(); } @Override public void onCreate(SQLiteDatabase db) { } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } public RadioDetails getFavourite(long id) { RadioDetails radioDetails = null; Cursor cursor = myDataBase.query(FAVOURITES_TABLE, new String[]{FAVOURITES_ID, FAVOURITES_NAME, FAVOURITES_URL}, "_ID = ?", new String[]{String.valueOf(id)}, null, null, null); if (cursor.moveToFirst()) { radioDetails = new RadioDetails(cursor.getInt(0), cursor.getString(1), cursor.getString(2), null); } return radioDetails; } public Cursor getFavourites() { return myDataBase.query(FAVOURITES_TABLE, new String[]{FAVOURITES_ID, FAVOURITES_NAME, FAVOURITES_URL}, null, null, null, null, null); } public void addFavourite(RadioDetails radioDetails) { Log.d(TAG, "Attempting to add: " + radioDetails); ContentValues contentValues = new ContentValues(); contentValues.put(FAVOURITES_NAME, radioDetails.getStationName()); if (StringUtils.IsNullOrEmpty(radioDetails.getPlaylistUrl())) { contentValues.put(FAVOURITES_URL, radioDetails.getStreamUrl()); } else { contentValues.put(FAVOURITES_URL, radioDetails.getPlaylistUrl()); } myDataBase.insert(FAVOURITES_TABLE, FAVOURITES_NAME, contentValues); } public void deleteFavourite(long id) { myDataBase.delete(FAVOURITES_TABLE, "_id=?", new String[]{Long.toString(id)}); } public void updateFavourite(RadioDetails radioDetails) { ContentValues contentValues = new ContentValues(); contentValues.put(FAVOURITES_NAME, radioDetails.getStationName()); contentValues.put(FAVOURITES_URL, StringUtils.IsNullOrEmpty(radioDetails.getPlaylistUrl()) ? radioDetails.getStreamUrl() : radioDetails.getPlaylistUrl()); myDataBase.update(FAVOURITES_TABLE, contentValues, "_id=?", new String[]{Long.toString(radioDetails.getId())}); } public Cursor getRecordingTypes() { return myDataBase.query(RECORDING_TYPES_TABLE, new String[]{RECORDING_TYPES_ID, RECORDING_TYPES_TYPE}, null, null, null, null, null); } public long insertScheduledRecording(long startTime, long endTime, int station, int type) { ContentValues contentValues = new ContentValues(); contentValues.put(SCHEDULED_RECORDINGS_START_TIME, startTime); contentValues.put(SCHEDULED_RECORDINGS_END_TIME, endTime); contentValues.put(SCHEDULED_RECORDINGS_STATION, station); contentValues.put(SCHEDULED_RECORDINGS_TYPE, type); return myDataBase.insert(SCHEDULED_RECORDINGS_TABLE, SCHEDULED_RECORDINGS_START_TIME, contentValues); } public void deleteScheduledRecording(long id) { myDataBase.delete(SCHEDULED_RECORDINGS_TABLE, "_id=?", new String[]{Long.toString(id)}); } public void updateScheduledRecording(long scheduledRecordingId, long startDateTime, long endDateTime, int station, int type) { ContentValues contentValues = new ContentValues(); contentValues.put(SCHEDULED_RECORDINGS_STATION, station); contentValues.put(SCHEDULED_RECORDINGS_TYPE, type); contentValues.put(SCHEDULED_RECORDINGS_START_TIME, startDateTime); contentValues.put(SCHEDULED_RECORDINGS_START_TIME, startDateTime); contentValues.put(SCHEDULED_RECORDINGS_END_TIME, endDateTime); myDataBase.update(SCHEDULED_RECORDINGS_TABLE, contentValues, "_id=?", new String[]{Long.toString(scheduledRecordingId)}); } public void updateScheduledRecordingAddDay(long databaseId) { ScheduledRecording scheduledRecording = GetScheduledRecording(databaseId); if (scheduledRecording != null) { ContentValues contentValues = new ContentValues(); contentValues.put(SCHEDULED_RECORDINGS_START_TIME, DateUtils.addDay(scheduledRecording.startDateTime)); contentValues.put(SCHEDULED_RECORDINGS_END_TIME, DateUtils.addDay(scheduledRecording.endDateTime)); myDataBase.update(SCHEDULED_RECORDINGS_TABLE, contentValues, "_id=?", new String[]{Long.toString(databaseId)}); } } public ScheduledRecording GetScheduledRecording(long databaseId) { Cursor cursor = myDataBase.query(SCHEDULED_RECORDINGS_TABLE, new String[]{SCHEDULED_RECORDINGS_STATION, SCHEDULED_RECORDINGS_TYPE, SCHEDULED_RECORDINGS_START_TIME, SCHEDULED_RECORDINGS_END_TIME}, " _ID = ?", new String[]{String.valueOf(databaseId)}, null, null, null); ScheduledRecording scheduledRecording = new ScheduledRecording(); if (cursor.moveToFirst()) { scheduledRecording.station = cursor.getInt(0); scheduledRecording.type = cursor.getInt(1); scheduledRecording.startDateTime = cursor.getLong(2); scheduledRecording.endDateTime = cursor.getLong(3); } cursor.close(); return scheduledRecording; } public void updateScheduledRecordingAddWeek(long databaseId) { ScheduledRecording scheduledRecording = GetScheduledRecording(databaseId); if (scheduledRecording != null) { ContentValues contentValues = new ContentValues(); contentValues.put(SCHEDULED_RECORDINGS_START_TIME, DateUtils.addWeek(scheduledRecording.startDateTime)); contentValues.put(SCHEDULED_RECORDINGS_END_TIME, DateUtils.addWeek(scheduledRecording.endDateTime)); myDataBase.update(SCHEDULED_RECORDINGS_TABLE, contentValues, "_id=?", new String[]{Long.toString(databaseId)}); } } public Cursor getScheduledRecordingsList() { StringBuilder query = new StringBuilder(); query.append("SELECT RECORDING_SCHEDULE._ID, STATIONS.NAME, RECORDING_TYPE.TYPE, RECORDING_SCHEDULE.START_TIME, RECORDING_SCHEDULE.END_TIME "); query.append("FROM RECORDING_SCHEDULE, RECORDING_TYPE, STATIONS "); query.append("WHERE RECORDING_SCHEDULE.STATION = STATIONS._ID AND RECORDING_SCHEDULE.TYPE = RECORDING_TYPE._ID "); query.append("ORDER BY RECORDING_SCHEDULE.START_TIME"); return myDataBase.rawQuery(query.toString(), new String[]{}); } public Cursor getAllScheduledRecordings() { String[] columns = { SCHEDULED_RECORDINGS_ID, SCHEDULED_RECORDINGS_START_TIME, SCHEDULED_RECORDINGS_END_TIME, SCHEDULED_RECORDINGS_STATION, SCHEDULED_RECORDINGS_TYPE}; return myDataBase.query(SCHEDULED_RECORDINGS_TABLE, columns, null, null, null, null, null); } public RadioDetails getRadioDetail(long stationId) { Cursor cursor = myDataBase.query(STATIONS_TABLE, new String[]{STATIONS_NAME, STATIONS_URL}, " _ID = ?", new String[]{String.valueOf(stationId)}, null, null, null); RadioDetails radioDetails = new RadioDetails(); if (cursor.moveToFirst()) { radioDetails.setStationName(cursor.getString(0)); radioDetails.setPlaylistUrl(cursor.getString(1)); } cursor.close(); return radioDetails; } public class ScheduledRecording { public int station; public int type; public long startDateTime; public long endDateTime; } }