diff --git a/app/build.gradle b/app/build.gradle index 87a1530..b7afc16 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -7,8 +7,8 @@ android { applicationId "com.de.aldo_apps.aldo.mariokartcircuitselector" minSdkVersion 16 targetSdkVersion 25 - versionCode 6 - versionName "0.1.6" + versionCode 7 + versionName "0.1.7" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { diff --git a/app/src/main/java/com/de/aldo_apps/aldo/mariokartcircuitselector/DatabaseHandler.java b/app/src/main/java/com/de/aldo_apps/aldo/mariokartcircuitselector/DatabaseHandler.java index 72c4dca..c577cbb 100644 --- a/app/src/main/java/com/de/aldo_apps/aldo/mariokartcircuitselector/DatabaseHandler.java +++ b/app/src/main/java/com/de/aldo_apps/aldo/mariokartcircuitselector/DatabaseHandler.java @@ -5,6 +5,7 @@ import android.content.Context; import android.database.Cursor; import android.database.DatabaseUtils; import android.database.sqlite.SQLiteDatabase; +import android.support.annotation.Nullable; import android.util.Log; import com.de.aldo_apps.aldo.mariokartcircuitselector.database_models.Accessory; @@ -18,36 +19,6 @@ import com.readystatesoftware.sqliteasset.SQLiteAssetHelper; import java.util.ArrayList; -import static com.de.aldo_apps.aldo.mariokartcircuitselector.Constants.KEY_100_CCM; -import static com.de.aldo_apps.aldo.mariokartcircuitselector.Constants.KEY_150_CCM; -import static com.de.aldo_apps.aldo.mariokartcircuitselector.Constants.KEY_200_CCM; -import static com.de.aldo_apps.aldo.mariokartcircuitselector.Constants.KEY_50_CCM; -import static com.de.aldo_apps.aldo.mariokartcircuitselector.Constants.KEY_ACCESSORY; -import static com.de.aldo_apps.aldo.mariokartcircuitselector.Constants.KEY_AVAILABLE; -import static com.de.aldo_apps.aldo.mariokartcircuitselector.Constants.KEY_BIKES; -import static com.de.aldo_apps.aldo.mariokartcircuitselector.Constants.KEY_COVER_URI; -import static com.de.aldo_apps.aldo.mariokartcircuitselector.Constants.KEY_FREE_FOR_ALL; -import static com.de.aldo_apps.aldo.mariokartcircuitselector.Constants.KEY_GAME; -import static com.de.aldo_apps.aldo.mariokartcircuitselector.Constants.KEY_ID; -import static com.de.aldo_apps.aldo.mariokartcircuitselector.Constants.KEY_KART_FREE_FOR_ALL; -import static com.de.aldo_apps.aldo.mariokartcircuitselector.Constants.KEY_MIRROR_CLASS; -import static com.de.aldo_apps.aldo.mariokartcircuitselector.Constants.KEY_NAME; -import static com.de.aldo_apps.aldo.mariokartcircuitselector.Constants.KEY_NUMBER; -import static com.de.aldo_apps.aldo.mariokartcircuitselector.Constants.KEY_PACKAGE; -import static com.de.aldo_apps.aldo.mariokartcircuitselector.Constants.KEY_WEIGHT; -import static com.de.aldo_apps.aldo.mariokartcircuitselector.Constants.KEY_WHEELS; -import static com.de.aldo_apps.aldo.mariokartcircuitselector.Constants.PROJECTION_CHARACTER; -import static com.de.aldo_apps.aldo.mariokartcircuitselector.Constants.PROJECTION_GAME; -import static com.de.aldo_apps.aldo.mariokartcircuitselector.Constants.PROJECTION_KART; -import static com.de.aldo_apps.aldo.mariokartcircuitselector.Constants.PROJECTION_RULESET; -import static com.de.aldo_apps.aldo.mariokartcircuitselector.Constants.PROJECTION_TRACK; -import static com.de.aldo_apps.aldo.mariokartcircuitselector.Constants.TABLE_CHARACTER; -import static com.de.aldo_apps.aldo.mariokartcircuitselector.Constants.TABLE_GAME; -import static com.de.aldo_apps.aldo.mariokartcircuitselector.Constants.TABLE_KART; -import static com.de.aldo_apps.aldo.mariokartcircuitselector.Constants.TABLE_RULESET; -import static com.de.aldo_apps.aldo.mariokartcircuitselector.Constants.TABLE_TRACK; -import static com.de.aldo_apps.aldo.mariokartcircuitselector.Constants.TABLE_WHEELS; - /** * The Database Handler class which opens/closes connection and handles all CRUD Operations * on the Database. @@ -63,8 +34,16 @@ public class DatabaseHandler extends SQLiteAssetHelper { */ private static final String TAG = "DatabaseHandler"; + /** + * The context from which this Handler was called. + */ private final Context mContext; + /** + * The default constructor of the DatabaseHandler. + * + * @param context The context from which this Handler was called. + */ public DatabaseHandler(final Context context) { super(context, Constants.DATABASE_NAME, null, Constants.DATABASE_VERSION); mContext = context; @@ -80,23 +59,25 @@ public class DatabaseHandler extends SQLiteAssetHelper { * * @param track The track which should be marked as available/unavailable. * @param isAvailable The status of availability to be set. + * * @return The result code of the update function. */ - public int changeTrackAvailability(final Track track, final boolean isAvailable) { + public int changeTrackAvailability(final Track track, + final boolean isAvailable) { final SQLiteDatabase db = this.getWritableDatabase(); final ContentValues values = new ContentValues(); values.put(Constants.KEY_GAME, track.getGame()); - values.put(KEY_NAME, track.getName()); + values.put(Constants.KEY_NAME, track.getName()); values.put(Constants.KEY_PACKAGE, track.getPackage()); values.put(Constants.KEY_NUMBER, track.getmNumber()); if (isAvailable) { - values.put(KEY_AVAILABLE, Constants.TRUE); + values.put(Constants.KEY_AVAILABLE, String.valueOf(Constants.TRUE)); } else { - values.put(KEY_AVAILABLE, Constants.FALSE); + values.put(Constants.KEY_AVAILABLE, Constants.FALSE); } - return db.update(Constants.TABLE_TRACK, values, KEY_ID + " = ?", + return db.update(Constants.TABLE_TRACK, values, Constants.KEY_ID + " = ?", new String[]{String.valueOf(track.getId())}); } @@ -105,22 +86,24 @@ public class DatabaseHandler extends SQLiteAssetHelper { * * @param character The character which should be marked as available/unavailable. * @param isAvailable The status of availability to be set. + * * @return The result code of the update function. */ - public int changeCharacterAvailability(final Character character, final boolean isAvailable) { + public int changeCharacterAvailability(final Character character, + final boolean isAvailable) { final SQLiteDatabase db = this.getWritableDatabase(); final ContentValues values = new ContentValues(); values.put(Constants.KEY_GAME, character.getGame()); - values.put(KEY_NAME, character.getName()); + values.put(Constants.KEY_NAME, character.getName()); values.put(Constants.KEY_WEIGHT, character.getWeight()); if (isAvailable) { - values.put(KEY_AVAILABLE, Constants.TRUE); + values.put(Constants.KEY_AVAILABLE, String.valueOf(Constants.TRUE)); } else { - values.put(KEY_AVAILABLE, Constants.FALSE); + values.put(Constants.KEY_AVAILABLE, Constants.FALSE); } - return db.update(Constants.TABLE_CHARACTER, values, KEY_ID + " = ?", + return db.update(Constants.TABLE_CHARACTER, values, Constants.KEY_ID + " = ?", new String[]{String.valueOf(character.getId())}); } @@ -129,26 +112,28 @@ public class DatabaseHandler extends SQLiteAssetHelper { * * @param kart The kart which should be marked as available/unavailable. * @param isAvailable The status of availability to be set. + * * @return The result code of the update function. */ - public int changeKartAvailability(final Kart kart, final boolean isAvailable) { + public int changeKartAvailability(final Kart kart, + final boolean isAvailable) { final SQLiteDatabase db = this.getWritableDatabase(); final ContentValues values = new ContentValues(); values.put(Constants.KEY_GAME, kart.getGame()); - values.put(KEY_NAME, kart.getName()); + values.put(Constants.KEY_NAME, kart.getName()); values.put(Constants.KEY_WEIGHT, kart.getWeight()); values.put(Constants.KEY_WHEELS, kart.getWheels()); values.put(Constants.KEY_ACCESSORY, kart.getAccessory()); values.put(Constants.KEY_DEDICATED_DRIVER, kart.getDedicatedDriver()); values.put(Constants.KEY_FREE_FOR_ALL, kart.getFreeForAll()); if (isAvailable) { - values.put(KEY_AVAILABLE, Constants.TRUE); + values.put(Constants.KEY_AVAILABLE, String.valueOf(Constants.TRUE)); } else { - values.put(KEY_AVAILABLE, Constants.FALSE); + values.put(Constants.KEY_AVAILABLE, Constants.FALSE); } - return db.update(Constants.TABLE_KART, values, KEY_ID + " = ?", + return db.update(Constants.TABLE_KART, values, Constants.KEY_ID + " = ?", new String[]{String.valueOf(kart.getId())}); } @@ -157,21 +142,23 @@ public class DatabaseHandler extends SQLiteAssetHelper { * * @param accessory The accessory which should be marked as available/unavailable. * @param isAvailable The status of availability to be set. + * * @return The result code of the update function. */ - public int changeAccessoryAvailability(final Accessory accessory, final boolean isAvailable) { + public int changeAccessoryAvailability(final Accessory accessory, + final boolean isAvailable) { final SQLiteDatabase db = this.getWritableDatabase(); final ContentValues values = new ContentValues(); values.put(Constants.KEY_GAME, accessory.getGame()); - values.put(KEY_NAME, accessory.getName()); + values.put(Constants.KEY_NAME, accessory.getName()); if (isAvailable) { - values.put(KEY_AVAILABLE, Constants.TRUE); + values.put(Constants.KEY_AVAILABLE, String.valueOf(Constants.TRUE)); } else { - values.put(KEY_AVAILABLE, Constants.FALSE); + values.put(Constants.KEY_AVAILABLE, Constants.FALSE); } - return db.update(Constants.TABLE_ACCESSORY, values, KEY_ID + " = ?", + return db.update(Constants.TABLE_ACCESSORY, values, Constants.KEY_ID + " = ?", new String[]{String.valueOf(accessory.getId())}); } @@ -180,21 +167,23 @@ public class DatabaseHandler extends SQLiteAssetHelper { * * @param wheels The wheels which should be marked as available/unavailable. * @param isAvailable The status of availability to be set. + * * @return The result code of the update function. */ - public int changeWheelsAvailability(final Wheels wheels, final boolean isAvailable) { + public int changeWheelsAvailability(final Wheels wheels, + final boolean isAvailable) { final SQLiteDatabase db = this.getWritableDatabase(); final ContentValues values = new ContentValues(); values.put(Constants.KEY_GAME, wheels.getGame()); - values.put(KEY_NAME, wheels.getGame()); + values.put(Constants.KEY_NAME, wheels.getGame()); if (isAvailable) { - values.put(KEY_AVAILABLE, Constants.TRUE); + values.put(Constants.KEY_AVAILABLE, String.valueOf(Constants.TRUE)); } else { - values.put(KEY_AVAILABLE, Constants.FALSE); + values.put(Constants.KEY_AVAILABLE, Constants.FALSE); } - return db.update(TABLE_WHEELS, values, KEY_ID + " = ?", + return db.update(Constants.TABLE_WHEELS, values, Constants.KEY_ID + " = ?", new String[]{String.valueOf(wheels.getId())}); } @@ -203,15 +192,36 @@ public class DatabaseHandler extends SQLiteAssetHelper { // ------------------------------------------------------------------------------------------- /** - * Retrieves all Tracks from Database. + * Retrieves all Tracks from Database. If a Game is provided, all tracks of this specific + * game will be retrieved. * + * @param game The game of which all tracks should be retrieved. + * @param onlyAvailable If true, only available objects will be returned, otherwise all + * * @return List containing all Track Objects retrieved from Database. */ - public ArrayList getAllTracks() { + public ArrayList getAllTracks(@Nullable final Game game, + final boolean onlyAvailable) { final SQLiteDatabase database = this.getReadableDatabase(); - final Cursor cursor = database.query(TABLE_TRACK, PROJECTION_TRACK, null, - null, null, null, null, null); + final String selectionClause; + final String[] selectionArgs; + if (game != null && onlyAvailable) { + selectionClause = Constants.KEY_GAME + "=? AND " + Constants.KEY_AVAILABLE + "=?"; + selectionArgs = new String[]{game.getName(), String.valueOf(Constants.TRUE)}; + } else if (game != null) { + selectionClause = Constants.KEY_GAME + "=?"; + selectionArgs = new String[]{game.getName()}; + } else if (onlyAvailable) { + selectionClause = Constants.KEY_AVAILABLE + "=?"; + selectionArgs = new String[]{String.valueOf(Constants.TRUE)}; + } else { + selectionClause = null; + selectionArgs = null; + } + + final Cursor cursor = database.query(Constants.TABLE_TRACK, Constants.PROJECTION_TRACK, + selectionClause, selectionArgs, null, null, null, null); if (cursor != null) { Log.d(TAG, "getAllTracks: Moving cursor to first."); cursor.moveToFirst(); @@ -223,54 +233,54 @@ public class DatabaseHandler extends SQLiteAssetHelper { final ArrayList allAvailableTrack = new ArrayList<>(); do { - final int idIdx = cursor.getColumnIndex(KEY_ID); - final int nameIdx = cursor.getColumnIndex(KEY_NAME); - final int gameIdx = cursor.getColumnIndex(KEY_GAME); - final int packageIdx = cursor.getColumnIndex(KEY_PACKAGE); - final int numberIdx = cursor.getColumnIndex(KEY_NUMBER); - final int availableIdx = cursor.getColumnIndex(KEY_AVAILABLE); + final int idIdx = cursor.getColumnIndex(Constants.KEY_ID); + final int nameIdx = cursor.getColumnIndex(Constants.KEY_NAME); + final int gameIdx = cursor.getColumnIndex(Constants.KEY_GAME); + final int packageIdx = cursor.getColumnIndex(Constants.KEY_PACKAGE); + final int numberIdx = cursor.getColumnIndex(Constants.KEY_NUMBER); + final int availableIdx = cursor.getColumnIndex(Constants.KEY_AVAILABLE); final Track track = new Track(); boolean isValid = true; if (idIdx >= 0) { track.setId(cursor.getInt(idIdx)); } else { - Log.d(TAG, "getAllTracks: No such column [" + KEY_ID + "]"); + Log.d(TAG, "getAllTracks: No such column [" + Constants.KEY_ID + "]"); isValid = false; } if (nameIdx >= 0) { track.setName(cursor.getString(nameIdx)); } else { - Log.d(TAG, "getAllTracks: No such column [" + KEY_NAME + "]"); + Log.d(TAG, "getAllTracks: No such column [" + Constants.KEY_NAME + "]"); isValid = false; } if (gameIdx >= 0) { track.setGame(cursor.getString(gameIdx)); } else { - Log.d(TAG, "getAllTracks: No such column [" + KEY_GAME + "]"); + Log.d(TAG, "getAllTracks: No such column [" + Constants.KEY_GAME + "]"); isValid = false; } if (packageIdx >= 0) { track.setPackage(cursor.getString(packageIdx)); } else { - Log.d(TAG, "getAllTracks: No such column [" + KEY_PACKAGE + "]"); + Log.d(TAG, "getAllTracks: No such column [" + Constants.KEY_PACKAGE + "]"); isValid = false; } if (numberIdx >= 0) { track.setPackage(cursor.getString(numberIdx)); } else { - Log.d(TAG, "getAllTracks: No such column [" + KEY_NUMBER + "]"); + Log.d(TAG, "getAllTracks: No such column [" + Constants.KEY_NUMBER + "]"); isValid = false; } if (availableIdx < 0) { track.setAvailable(cursor.getInt(availableIdx)); } else { - Log.d(TAG, "getAllTracks: No such column [" + KEY_AVAILABLE + "]"); + Log.d(TAG, "getAllTracks: No such column [" + Constants.KEY_AVAILABLE + "]"); isValid = false; } @@ -290,15 +300,36 @@ public class DatabaseHandler extends SQLiteAssetHelper { } /** - * Retrieves all Karts from Database. + * Retrieves all Karts from Database. If a Game is provided, all karts of this specific + * game will be retrieved. + * + * @param game The game of which all tracks should be retrieved. + * @param onlyAvailable If true, only available objects will be returned, otherwise all * * @return List containing all Kart Objects retrieved from Database. */ - public ArrayList getAllKarts() { + public ArrayList getAllKarts(@Nullable final Game game, + final boolean onlyAvailable) { final SQLiteDatabase database = this.getReadableDatabase(); - final Cursor cursor = database.query(TABLE_KART, PROJECTION_KART, null, - null, null, null, null, null); + final String selectionClause; + final String[] selectionArgs; + if (game != null && onlyAvailable) { + selectionClause = Constants.KEY_GAME + "=? AND " + Constants.KEY_AVAILABLE + "=?"; + selectionArgs = new String[]{game.getName(), String.valueOf(Constants.TRUE)}; + } else if (game != null) { + selectionClause = Constants.KEY_GAME + "=?"; + selectionArgs = new String[]{game.getName()}; + } else if (onlyAvailable) { + selectionClause = Constants.KEY_AVAILABLE + "=?"; + selectionArgs = new String[]{String.valueOf(Constants.TRUE)}; + } else { + selectionClause = null; + selectionArgs = null; + } + + final Cursor cursor = database.query(Constants.TABLE_KART, Constants.PROJECTION_KART, + selectionClause, selectionArgs, null, null, null, null); if (cursor != null) { Log.d(TAG, "getAllKarts: Moving cursor to first."); cursor.moveToFirst(); @@ -310,70 +341,70 @@ public class DatabaseHandler extends SQLiteAssetHelper { final ArrayList allAvailableKarts = new ArrayList<>(); do { - final int idIdx = cursor.getColumnIndex(KEY_ID); - final int nameIdx = cursor.getColumnIndex(KEY_NAME); - final int gameIdx = cursor.getColumnIndex(KEY_GAME); - final int weightIdx = cursor.getColumnIndex(KEY_WEIGHT); - final int accessoryIdx = cursor.getColumnIndex(KEY_ACCESSORY); - final int wheelsIdx = cursor.getColumnIndex(KEY_WHEELS); - final int freeForAllIdx = cursor.getColumnIndex(KEY_FREE_FOR_ALL); - final int availableIdx = cursor.getColumnIndex(KEY_AVAILABLE); + final int idIdx = cursor.getColumnIndex(Constants.KEY_ID); + final int nameIdx = cursor.getColumnIndex(Constants.KEY_NAME); + final int gameIdx = cursor.getColumnIndex(Constants.KEY_GAME); + final int weightIdx = cursor.getColumnIndex(Constants.KEY_WEIGHT); + final int accessoryIdx = cursor.getColumnIndex(Constants.KEY_ACCESSORY); + final int wheelsIdx = cursor.getColumnIndex(Constants.KEY_WHEELS); + final int freeForAllIdx = cursor.getColumnIndex(Constants.KEY_FREE_FOR_ALL); + final int availableIdx = cursor.getColumnIndex(Constants.KEY_AVAILABLE); final Kart kart = new Kart(); boolean isValid = true; if (idIdx >= 0) { kart.setId(cursor.getInt(idIdx)); } else { - Log.d(TAG, "getAllKarts: No such column [" + KEY_ID + "]"); + Log.d(TAG, "getAllKarts: No such column [" + Constants.KEY_ID + "]"); isValid = false; } if (nameIdx >= 0) { kart.setName(cursor.getString(nameIdx)); } else { - Log.d(TAG, "getAllKarts: No such column [" + KEY_NAME + "]"); + Log.d(TAG, "getAllKarts: No such column [" + Constants.KEY_NAME + "]"); isValid = false; } if (gameIdx >= 0) { kart.setGame(cursor.getString(gameIdx)); } else { - Log.d(TAG, "getAllKarts: No such column [" + KEY_GAME + "]"); + Log.d(TAG, "getAllKarts: No such column [" + Constants.KEY_GAME + "]"); isValid = false; } if (weightIdx >= 0) { kart.setWeight(cursor.getString(weightIdx)); } else { - Log.d(TAG, "getAllKarts: No such column [" + KEY_WEIGHT + "]"); + Log.d(TAG, "getAllKarts: No such column [" + Constants.KEY_WEIGHT + "]"); isValid = false; } if (accessoryIdx >= 0) { kart.setAccessory(cursor.getInt(accessoryIdx)); } else { - Log.d(TAG, "getAllKarts: No such column [" + KEY_ACCESSORY + "]"); + Log.d(TAG, "getAllKarts: No such column [" + Constants.KEY_ACCESSORY + "]"); isValid = false; } if (wheelsIdx >= 0) { kart.setWheels(cursor.getInt(wheelsIdx)); } else { - Log.d(TAG, "getAllKarts: No such column [" + KEY_WHEELS + "]"); + Log.d(TAG, "getAllKarts: No such column [" + Constants.KEY_WHEELS + "]"); isValid = false; } if (freeForAllIdx >= 0) { kart.setFreeForAll(cursor.getInt(freeForAllIdx)); } else { - Log.d(TAG, "getAllKarts: No such column [" + KEY_FREE_FOR_ALL + "]"); + Log.d(TAG, "getAllKarts: No such column [" + Constants.KEY_FREE_FOR_ALL + "]"); isValid = false; } if (availableIdx < 0) { kart.setAvailable(cursor.getInt(availableIdx)); } else { - Log.d(TAG, "getAllKarts: No such column [" + KEY_AVAILABLE + "]"); + Log.d(TAG, "getAllKarts: No such column [" + Constants.KEY_AVAILABLE + "]"); isValid = false; } @@ -393,31 +424,46 @@ public class DatabaseHandler extends SQLiteAssetHelper { } /** - * Retrieves all Characters from Database. + * Retrieves all Characters from Database. If a Game is provided, all characters of this + * specific game will be retrieved. + * + * @param game The game of which all tracks should be retrieved. + * @param onlyAvailable If true, only available objects will be returned, otherwise all * * @return List containing all Character Objects retrieved from Database. */ - public ArrayList getAllCharacters() { + public ArrayList getAllCharacters(@Nullable final Game game, + final boolean onlyAvailable) { final SQLiteDatabase database = this.getReadableDatabase(); - final Cursor cursor = database.query(TABLE_CHARACTER, PROJECTION_CHARACTER, null, - null, null, null, null, null); - if (cursor != null) { - Log.d(TAG, "getAllCharacters: Moving cursor to first."); - cursor.moveToFirst(); + final String selectionClause; + final String[] selectionArgs; + if (game != null && onlyAvailable) { + selectionClause = Constants.KEY_GAME + "=? AND " + Constants.KEY_AVAILABLE + "=?"; + selectionArgs = new String[]{game.getName(), String.valueOf(Constants.TRUE)}; + } else if (game != null) { + selectionClause = Constants.KEY_GAME + "=?"; + selectionArgs = new String[]{game.getName()}; + } else if (onlyAvailable) { + selectionClause = Constants.KEY_AVAILABLE + "=?"; + selectionArgs = new String[]{String.valueOf(Constants.TRUE)}; } else { - Log.d(TAG, "getAllCharacters: cursor is null"); - return null; + selectionClause = null; + selectionArgs = null; } + final Cursor cursor = database.query(Constants.TABLE_CHARACTER, + Constants.PROJECTION_CHARACTER, selectionClause, selectionArgs, null, null, null, + null); + final ArrayList allAvailableCharacters = new ArrayList<>(); do { - final int idIdx = cursor.getColumnIndex(KEY_ID); - final int nameIdx = cursor.getColumnIndex(KEY_NAME); - final int gameIdx = cursor.getColumnIndex(KEY_GAME); - final int weightIdx = cursor.getColumnIndex(KEY_WEIGHT); - final int availableIdx = cursor.getColumnIndex(KEY_AVAILABLE); + final int idIdx = cursor.getColumnIndex(Constants.KEY_ID); + final int nameIdx = cursor.getColumnIndex(Constants.KEY_NAME); + final int gameIdx = cursor.getColumnIndex(Constants.KEY_GAME); + final int weightIdx = cursor.getColumnIndex(Constants.KEY_WEIGHT); + final int availableIdx = cursor.getColumnIndex(Constants.KEY_AVAILABLE); final Character character = new Character(); boolean isValid = true; @@ -425,35 +471,35 @@ public class DatabaseHandler extends SQLiteAssetHelper { if (idIdx >= 0) { character.setId(cursor.getInt(idIdx)); } else { - Log.d(TAG, "getAllCharacters: No such column [" + KEY_ID + "]"); + Log.d(TAG, "getAllCharacters: No such column [" + Constants.KEY_ID + "]"); isValid = false; } if (nameIdx >= 0) { character.setName(cursor.getString(nameIdx)); } else { - Log.d(TAG, "getAllCharacters: No such column [" + KEY_NAME + "]"); + Log.d(TAG, "getAllCharacters: No such column [" + Constants.KEY_NAME + "]"); isValid = false; } if (gameIdx >= 0) { character.setGame(cursor.getString(gameIdx)); } else { - Log.d(TAG, "getAllCharacters: No such column [" + KEY_GAME + "]"); + Log.d(TAG, "getAllCharacters: No such column [" + Constants.KEY_GAME + "]"); isValid = false; } if (weightIdx >= 0) { character.setWeight(cursor.getString(weightIdx)); } else { - Log.d(TAG, "getAllCharacters: No such column [" + KEY_WEIGHT + "]"); + Log.d(TAG, "getAllCharacters: No such column [" + Constants.KEY_WEIGHT + "]"); isValid = false; } if (availableIdx < 0) { character.setAvailable(cursor.getInt(availableIdx)); } else { - Log.d(TAG, "getAllCharacters: No such column [" + KEY_AVAILABLE + "]"); + Log.d(TAG, "getAllCharacters: No such column [" + Constants.KEY_AVAILABLE + "]"); isValid = false; } @@ -474,34 +520,48 @@ public class DatabaseHandler extends SQLiteAssetHelper { } /** - * Retrieves all Rulesets from Database. + * Retrieves all Rulesets from Database. If a Game is provided, the ruleset of this specific + * game will be retrieved. + * + * @param game The game of which all tracks should be retrieved. + * @param onlyAvailable If true, only available objects will be returned, otherwise all * * @return List containing all Ruleset Objects retrieved from Database. */ - public ArrayList getAllRulesets() { + public ArrayList getAllRulesets(@Nullable final Game game, + final boolean onlyAvailable) { final SQLiteDatabase database = this.getReadableDatabase(); - final Cursor cursor = database.query(TABLE_RULESET, PROJECTION_RULESET, null, - null, null, null, null, null); - if (cursor != null) { - Log.d(TAG, "getAllRulesets: Moving cursor to first."); - cursor.moveToFirst(); + final String selectionClause; + final String[] selectionArgs; + if (game != null && onlyAvailable) { + selectionClause = Constants.KEY_GAME + "=? AND " + Constants.KEY_AVAILABLE + "=?"; + selectionArgs = new String[]{game.getName(), String.valueOf(Constants.TRUE)}; + } else if (game != null) { + selectionClause = Constants.KEY_GAME + "=?"; + selectionArgs = new String[]{game.getName()}; + } else if (onlyAvailable) { + selectionClause = Constants.KEY_AVAILABLE + "=?"; + selectionArgs = new String[]{String.valueOf(Constants.TRUE)}; } else { - Log.d(TAG, "getAllRulesets: cursor is null"); - return null; + selectionClause = null; + selectionArgs = null; } + final Cursor cursor = database.query(Constants.TABLE_RULESET, Constants.PROJECTION_RULESET, + selectionClause, selectionArgs, null, null, null, null); + final ArrayList allAvailableRulesets = new ArrayList<>(); do { - final int idIdx = cursor.getColumnIndex(KEY_ID); - final int gameIdx = cursor.getColumnIndex(KEY_GAME); - final int mirrorIdx = cursor.getColumnIndex(KEY_MIRROR_CLASS); - final int ccm50Idx = cursor.getColumnIndex(KEY_50_CCM); - final int ccm100Idx = cursor.getColumnIndex(KEY_100_CCM); - final int ccm150Idx = cursor.getColumnIndex(KEY_150_CCM); - final int ccm200Idx = cursor.getColumnIndex(KEY_200_CCM); - final int freeForAllIdx = cursor.getColumnIndex(KEY_KART_FREE_FOR_ALL); - final int bikesIdx = cursor.getColumnIndex(KEY_BIKES); + final int idIdx = cursor.getColumnIndex(Constants.KEY_ID); + final int gameIdx = cursor.getColumnIndex(Constants.KEY_GAME); + final int mirrorIdx = cursor.getColumnIndex(Constants.KEY_MIRROR_CLASS); + final int ccm50Idx = cursor.getColumnIndex(Constants.KEY_50_CCM); + final int ccm100Idx = cursor.getColumnIndex(Constants.KEY_100_CCM); + final int ccm150Idx = cursor.getColumnIndex(Constants.KEY_150_CCM); + final int ccm200Idx = cursor.getColumnIndex(Constants.KEY_200_CCM); + final int freeForAllIdx = cursor.getColumnIndex(Constants.KEY_KART_FREE_FOR_ALL); + final int bikesIdx = cursor.getColumnIndex(Constants.KEY_BIKES); final Ruleset ruleset = new Ruleset(); boolean isValid = true; @@ -509,63 +569,64 @@ public class DatabaseHandler extends SQLiteAssetHelper { if (idIdx >= 0) { ruleset.setId(cursor.getInt(idIdx)); } else { - Log.d(TAG, "getAllRulesets: No such column [" + KEY_ID + "]"); + Log.d(TAG, "getAllRulesets: No such column [" + Constants.KEY_ID + "]"); isValid = false; } if (gameIdx >= 0) { ruleset.setGame(cursor.getString(gameIdx)); } else { - Log.d(TAG, "getAllRulesets: No such column [" + KEY_GAME + "]"); + Log.d(TAG, "getAllRulesets: No such column [" + Constants.KEY_GAME + "]"); isValid = false; } if (mirrorIdx >= 0) { ruleset.setGame(cursor.getString(gameIdx)); } else { - Log.d(TAG, "getAllRulesets: No such column [" + KEY_GAME + "]"); + Log.d(TAG, "getAllRulesets: No such column [" + Constants.KEY_GAME + "]"); isValid = false; } if (ccm50Idx >= 0) { ruleset.set50CcmAvailable(cursor.getInt(ccm50Idx)); } else { - Log.d(TAG, "getAllRulesets: No such column [" + KEY_50_CCM + "]"); + Log.d(TAG, "getAllRulesets: No such column [" + Constants.KEY_50_CCM + "]"); isValid = false; } if (ccm100Idx >= 0) { ruleset.set100CcmAvailable(cursor.getInt(ccm100Idx)); } else { - Log.d(TAG, "getAllRulesets: No such column [" + KEY_100_CCM + "]"); + Log.d(TAG, "getAllRulesets: No such column [" + Constants.KEY_100_CCM + "]"); isValid = false; } if (ccm150Idx >= 0) { ruleset.set150CcmAvailable(cursor.getInt(ccm150Idx)); } else { - Log.d(TAG, "getAllRulesets: No such column [" + KEY_150_CCM + "]"); + Log.d(TAG, "getAllRulesets: No such column [" + Constants.KEY_150_CCM + "]"); isValid = false; } if (ccm200Idx >= 0) { ruleset.set200CcmAvailable(cursor.getInt(ccm200Idx)); } else { - Log.d(TAG, "getAllRulesets: No such column [" + KEY_200_CCM + "]"); + Log.d(TAG, "getAllRulesets: No such column [" + Constants.KEY_200_CCM + "]"); isValid = false; } if (freeForAllIdx >= 0) { ruleset.setKartsFreeForAll(cursor.getInt(freeForAllIdx)); } else { - Log.d(TAG, "getAllRulesets: No such column [" + KEY_KART_FREE_FOR_ALL + "]"); + Log.d(TAG, "getAllRulesets: No such column [" + Constants.KEY_KART_FREE_FOR_ALL + + "]"); isValid = false; } if (bikesIdx >= 0) { ruleset.setBikesAvailable(cursor.getInt(bikesIdx)); } else { - Log.d(TAG, "getAllRulesets: No such column [" + KEY_BIKES + "]"); + Log.d(TAG, "getAllRulesets: No such column [" + Constants.KEY_BIKES + "]"); isValid = false; } @@ -586,58 +647,73 @@ public class DatabaseHandler extends SQLiteAssetHelper { } /** - * Retrieves all Accessories from Database. + * Retrieves all Accessories from Database. If a Game is provided, all accessories of this + * specific game will be retrieved. + * + * @param game The game of which all tracks should be retrieved. + * @param onlyAvailable If true, only available objects will be returned, otherwise all * * @return List containing all Accessory Objects retrieved from Database. */ - public ArrayList getAllAccessories() { + public ArrayList getAllAccessories(@Nullable final Game game, + final boolean onlyAvailable) { final SQLiteDatabase database = this.getReadableDatabase(); - final Cursor cursor = database.query(TABLE_TRACK, PROJECTION_TRACK, null, - null, null, null, null, null); - if (cursor != null) { - Log.d(TAG, "getAllAccessories: Moving cursor to first."); - cursor.moveToFirst(); + final String selectionClause; + final String[] selectionArgs; + if (game != null && onlyAvailable) { + selectionClause = Constants.KEY_GAME + "=? AND " + Constants.KEY_AVAILABLE + "=?"; + selectionArgs = new String[]{game.getName(), String.valueOf(Constants.TRUE)}; + } else if (game != null) { + selectionClause = Constants.KEY_GAME + "=?"; + selectionArgs = new String[]{game.getName()}; + } else if (onlyAvailable) { + selectionClause = Constants.KEY_AVAILABLE + "=?"; + selectionArgs = new String[]{String.valueOf(Constants.TRUE)}; } else { - Log.d(TAG, "getAllAccessories: cursor is null"); - return null; + selectionClause = null; + selectionArgs = null; } + final Cursor cursor = database.query(Constants.TABLE_ACCESSORY, + Constants.PROJECTION_ACCESSORY, selectionClause, selectionArgs, null, null, null, + null); + final ArrayList allAvailableAccessories = new ArrayList<>(); do { - final int idIdx = cursor.getColumnIndex(KEY_ID); - final int nameIdx = cursor.getColumnIndex(KEY_NAME); - final int gameIdx = cursor.getColumnIndex(KEY_GAME); - final int availableIdx = cursor.getColumnIndex(KEY_AVAILABLE); + final int idIdx = cursor.getColumnIndex(Constants.KEY_ID); + final int nameIdx = cursor.getColumnIndex(Constants.KEY_NAME); + final int gameIdx = cursor.getColumnIndex(Constants.KEY_GAME); + final int availableIdx = cursor.getColumnIndex(Constants.KEY_AVAILABLE); final Accessory accessory = new Accessory(); boolean isValid = true; if (idIdx >= 0) { accessory.setId(cursor.getInt(idIdx)); } else { - Log.d(TAG, "getAllAccessories: No such column [" + KEY_ID + "]"); + Log.d(TAG, "getAllAccessories: No such column [" + Constants.KEY_ID + "]"); isValid = false; } if (nameIdx >= 0) { accessory.setName(cursor.getString(nameIdx)); } else { - Log.d(TAG, "getAllAccessories: No such column [" + KEY_NAME + "]"); + Log.d(TAG, "getAllAccessories: No such column [" + Constants.KEY_NAME + "]"); isValid = false; } if (gameIdx >= 0) { accessory.setGame(cursor.getString(gameIdx)); } else { - Log.d(TAG, "getAllAccessories: No such column [" + KEY_GAME + "]"); + Log.d(TAG, "getAllAccessories: No such column [" + Constants.KEY_GAME + "]"); isValid = false; } if (availableIdx < 0) { accessory.setAvailable(cursor.getInt(availableIdx)); } else { - Log.d(TAG, "getAllAccessories: No such column [" + KEY_AVAILABLE + "]"); + Log.d(TAG, "getAllAccessories: No such column [" + Constants.KEY_AVAILABLE + "]"); isValid = false; } @@ -658,15 +734,36 @@ public class DatabaseHandler extends SQLiteAssetHelper { } /** - * Retrieves all Wheels from Database. + * Retrieves all Wheels from Database. If a Game is provided, all wheels of this specific + * game will be retrieved. + * + * @param game The game of which all tracks should be retrieved. + * @param onlyAvailable If true, only available objects will be returned, otherwise all * * @return List containing all Wheels Objects retrieved from Database. */ - public ArrayList getAllWheels() { + public ArrayList getAllWheels(@Nullable final Game game, + final boolean onlyAvailable) { final SQLiteDatabase database = this.getReadableDatabase(); - final Cursor cursor = database.query(TABLE_TRACK, PROJECTION_TRACK, null, - null, null, null, null, null); + final String selectionClause; + final String[] selectionArgs; + if (game != null && onlyAvailable) { + selectionClause = Constants.KEY_GAME + "=? AND " + Constants.KEY_AVAILABLE + "=?"; + selectionArgs = new String[]{game.getName(), String.valueOf(Constants.TRUE)}; + } else if (game != null) { + selectionClause = Constants.KEY_GAME + "=?"; + selectionArgs = new String[]{game.getName()}; + } else if (onlyAvailable) { + selectionClause = Constants.KEY_AVAILABLE + "=?"; + selectionArgs = new String[]{String.valueOf(Constants.TRUE)}; + } else { + selectionClause = null; + selectionArgs = null; + } + + final Cursor cursor = database.query(Constants.TABLE_WHEELS, Constants.PROJECTION_WHEELS, + selectionClause, selectionArgs, null, null, null, null); if (cursor != null) { Log.d(TAG, "getAllWheels: Moving cursor to first."); cursor.moveToFirst(); @@ -678,38 +775,38 @@ public class DatabaseHandler extends SQLiteAssetHelper { final ArrayList allAvailableWheels = new ArrayList<>(); do { - final int idIdx = cursor.getColumnIndex(KEY_ID); - final int nameIdx = cursor.getColumnIndex(KEY_NAME); - final int gameIdx = cursor.getColumnIndex(KEY_GAME); - final int availableIdx = cursor.getColumnIndex(KEY_AVAILABLE); + final int idIdx = cursor.getColumnIndex(Constants.KEY_ID); + final int nameIdx = cursor.getColumnIndex(Constants.KEY_NAME); + final int gameIdx = cursor.getColumnIndex(Constants.KEY_GAME); + final int availableIdx = cursor.getColumnIndex(Constants.KEY_AVAILABLE); final Wheels wheels = new Wheels(); boolean isValid = true; if (idIdx >= 0) { wheels.setId(cursor.getInt(idIdx)); } else { - Log.d(TAG, "getAllWheels: No such column [" + KEY_ID + "]"); + Log.d(TAG, "getAllWheels: No such column [" + Constants.KEY_ID + "]"); isValid = false; } if (nameIdx >= 0) { wheels.setName(cursor.getString(nameIdx)); } else { - Log.d(TAG, "getAllWheels: No such column [" + KEY_NAME + "]"); + Log.d(TAG, "getAllWheels: No such column [" + Constants.KEY_NAME + "]"); isValid = false; } if (gameIdx >= 0) { wheels.setGame(cursor.getString(gameIdx)); } else { - Log.d(TAG, "getAllWheels: No such column [" + KEY_GAME + "]"); + Log.d(TAG, "getAllWheels: No such column [" + Constants.KEY_GAME + "]"); isValid = false; } if (availableIdx < 0) { wheels.setAvailable(cursor.getInt(availableIdx)); } else { - Log.d(TAG, "getAllWheels: No such column [" + KEY_AVAILABLE + "]"); + Log.d(TAG, "getAllWheels: No such column [" + Constants.KEY_AVAILABLE + "]"); isValid = false; } @@ -736,7 +833,7 @@ public class DatabaseHandler extends SQLiteAssetHelper { public ArrayList getAllGames() { final SQLiteDatabase database = this.getReadableDatabase(); - final Cursor cursor = database.query(TABLE_GAME, PROJECTION_GAME, null, + final Cursor cursor = database.query(Constants.TABLE_GAME, Constants.PROJECTION_GAME, null, null, null, null, null, null); if (cursor != null) { Log.d(TAG, "getAllGames: Moving cursor to first."); @@ -749,30 +846,30 @@ public class DatabaseHandler extends SQLiteAssetHelper { final ArrayList allAvailableGames = new ArrayList<>(); do { - final int idIdx = cursor.getColumnIndex(KEY_ID); - final int nameIdx = cursor.getColumnIndex(KEY_NAME); - final int coverUriIdx = cursor.getColumnIndex(KEY_COVER_URI); + final int idIdx = cursor.getColumnIndex(Constants.KEY_ID); + final int nameIdx = cursor.getColumnIndex(Constants.KEY_NAME); + final int coverUriIdx = cursor.getColumnIndex(Constants.KEY_COVER_URI); final Game game = new Game(); boolean isValid = true; if (idIdx >= 0) { game.setId(cursor.getInt(idIdx)); } else { - Log.d(TAG, "getAllGames: No such column [" + KEY_ID + "]"); + Log.d(TAG, "getAllGames: No such column [" + Constants.KEY_ID + "]"); isValid = false; } if (nameIdx >= 0) { game.setName(cursor.getString(nameIdx)); } else { - Log.d(TAG, "getAllGames: No such column [" + KEY_NAME + "]"); + Log.d(TAG, "getAllGames: No such column [" + Constants.KEY_NAME + "]"); isValid = false; } if (coverUriIdx >= 0) { game.setCoverUri(cursor.getString(coverUriIdx)); } else { - Log.d(TAG, "getAllGames: No such column [" + KEY_COVER_URI + "]"); + Log.d(TAG, "getAllGames: No such column [" + Constants.KEY_COVER_URI + "]"); isValid = false; } @@ -795,14 +892,15 @@ public class DatabaseHandler extends SQLiteAssetHelper { // ------------------------------ T E S T F U N C T I O N S ------------------------------- // ------------------------------------------------------------------------------------------- + // TODO: This is only an intermediate state and can be removed later on public Track testDBConnection(final int id) { Log.d(TAG, "testDBConnection: Opening Readable Database."); final SQLiteDatabase database = this.getReadableDatabase(); Log.d(TAG, "testDBConnection: Query a single track for id = [" + id + "]"); - final Cursor cursor = database.query(TABLE_TRACK, new String[]{KEY_ID, - KEY_NAME, KEY_GAME, KEY_AVAILABLE}, KEY_ID + "=?", - new String[]{String.valueOf(id)}, null, null, null, null); + final Cursor cursor = database.query(Constants.TABLE_TRACK, new String[]{Constants.KEY_ID, + Constants.KEY_NAME, Constants.KEY_GAME, Constants.KEY_AVAILABLE}, + Constants.KEY_ID + "=?", new String[]{String.valueOf(id)}, null, null, null, null); if (cursor != null) { Log.d(TAG, "testDBConnection: Moving cursor to first."); cursor.moveToFirst(); @@ -813,30 +911,30 @@ public class DatabaseHandler extends SQLiteAssetHelper { DatabaseUtils.dumpCursor(cursor); - final int nameIdx = cursor.getColumnIndex(KEY_NAME); - final int gameIdx = cursor.getColumnIndex(KEY_GAME); - final int idIdx = cursor.getColumnIndex(KEY_ID); - final int availableIdx = cursor.getColumnIndex(KEY_AVAILABLE); + final int nameIdx = cursor.getColumnIndex(Constants.KEY_NAME); + final int gameIdx = cursor.getColumnIndex(Constants.KEY_GAME); + final int idIdx = cursor.getColumnIndex(Constants.KEY_ID); + final int availableIdx = cursor.getColumnIndex(Constants.KEY_AVAILABLE); if (nameIdx < 0) { - Log.d(TAG, "testDBConnection: No such column [" + KEY_NAME + "]"); + Log.d(TAG, "testDBConnection: No such column [" + Constants.KEY_NAME + "]"); } if (gameIdx < 0) { - Log.d(TAG, "testDBConnection: No such column [" + KEY_GAME + "]"); + Log.d(TAG, "testDBConnection: No such column [" + Constants.KEY_GAME + "]"); } if (idIdx < 0) { - Log.d(TAG, "testDBConnection: No such column [" + KEY_ID + "]"); + Log.d(TAG, "testDBConnection: No such column [" + Constants.KEY_ID + "]"); } if (availableIdx < 0) { - Log.d(TAG, "testDBConnection: No such column [" + KEY_AVAILABLE + "]"); + Log.d(TAG, "testDBConnection: No such column [" + Constants.KEY_AVAILABLE + "]"); } if (availableIdx >= 0 && idIdx >= 0 && gameIdx >= 0 && nameIdx >= 0) { final Track track = new Track(); - track.setName(cursor.getString(cursor.getColumnIndex(KEY_NAME))); - track.setGame(cursor.getString(cursor.getColumnIndex(KEY_GAME))); - track.setId(Integer.parseInt(cursor.getString(cursor.getColumnIndex(KEY_ID)))); - track.setAvailable(Integer.parseInt(cursor.getString(cursor.getColumnIndex(KEY_AVAILABLE)))); + track.setName(cursor.getString(nameIdx)); + track.setGame(cursor.getString(gameIdx)); + track.setId(Integer.parseInt(cursor.getString(idIdx))); + track.setAvailable(Integer.parseInt(cursor.getString(availableIdx))); database.close(); // return contact