diff options
| author | sigmabeta <sigmabeta@users.noreply.github.com> | 2015-06-08 20:27:12 -0400 |
|---|---|---|
| committer | sigmabeta <sigmabeta@users.noreply.github.com> | 2015-06-08 20:27:12 -0400 |
| commit | b7dcbdbf57753d48a5324ab13a88a7b82ae3c71c (patch) | |
| tree | 08246a71362b0310a81b0e3721800e947e2201ca /Source/Android/app/src/main/java | |
| parent | d56f27857b76c9c7bc00a4f5e9de38e597fa7fa6 (diff) | |
Android: Database improvements - remove non-existent games & folders.
Diffstat (limited to 'Source/Android/app/src/main/java')
| -rw-r--r-- | Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/GameDatabase.java | 134 | ||||
| -rw-r--r-- | Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/GameProvider.java | 1 |
2 files changed, 89 insertions, 46 deletions
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/GameDatabase.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/GameDatabase.java index 4c2bffed0d..6604717d92 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/GameDatabase.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/GameDatabase.java @@ -111,10 +111,35 @@ public final class GameDatabase extends SQLiteOpenHelper public void scanLibrary(SQLiteDatabase database) { - // TODO Before scanning known folders, go through the game table and remove any entries for which the file itself is missing. + // Before scanning known folders, go through the game table and remove any entries for which the file itself is missing. + Cursor fileCursor = database.query(TABLE_NAME_GAMES, + null, // Get all columns. + null, // Get all rows. + null, + null, // No grouping. + null, + null); // Order of games is irrelevant. + + // Possibly overly defensive, but ensures that moveToNext() does not skip a row. + fileCursor.moveToPosition(-1); + + while (fileCursor.moveToNext()) + { + String gamePath = fileCursor.getString(GAME_COLUMN_PATH); + File game = new File(gamePath); + + if (!game.exists()) + { + Log.e("DolphinEmu", "Game file no longer exists. Removing from the library: " + gamePath); + database.delete(TABLE_NAME_GAMES, + KEY_DB_ID + " = ?", + new String[]{Long.toString(fileCursor.getLong(COLUMN_DB_ID))}); + } + } + // Get a cursor listing all the folders the user has added to the library. - Cursor cursor = database.query(TABLE_NAME_FOLDERS, + Cursor folderCursor = database.query(TABLE_NAME_FOLDERS, null, // Get all columns. null, // Get all rows. null, @@ -125,74 +150,91 @@ public final class GameDatabase extends SQLiteOpenHelper Set<String> allowedExtensions = new HashSet<String>(Arrays.asList(".dff", ".dol", ".elf", ".gcm", ".gcz", ".iso", ".wad", ".wbfs")); // Possibly overly defensive, but ensures that moveToNext() does not skip a row. - cursor.moveToPosition(-1); + folderCursor.moveToPosition(-1); // Iterate through all results of the DB query (i.e. all folders in the library.) - while (cursor.moveToNext()) + while (folderCursor.moveToNext()) { - String folderPath = cursor.getString(FOLDER_COLUMN_PATH); + String folderPath = folderCursor.getString(FOLDER_COLUMN_PATH); File folder = new File(folderPath); Log.i("DolphinEmu", "Reading files from library folder: " + folderPath); // Iterate through every file in the folder. File[] children = folder.listFiles(); - for (File file : children) + + if (children != null) { - if (!file.isHidden() && !file.isDirectory()) + for (File file : children) { - String filePath = file.getPath(); - - int extensionStart = filePath.lastIndexOf('.'); - if (extensionStart > 0) + if (!file.isHidden() && !file.isDirectory()) { - String fileExtension = filePath.substring(extensionStart); + String filePath = file.getPath(); - // Check that the file has an extension we care about before trying to read out of it. - if (allowedExtensions.contains(fileExtension)) + int extensionStart = filePath.lastIndexOf('.'); + if (extensionStart > 0) { - String name = NativeLibrary.GetTitle(filePath); + String fileExtension = filePath.substring(extensionStart); - // If the game's title field is empty, use the filename. - if (name.isEmpty()) + // Check that the file has an extension we care about before trying to read out of it. + if (allowedExtensions.contains(fileExtension)) { - name = filePath.substring(filePath.lastIndexOf("/") + 1); - } - - ContentValues game = Game.asContentValues(NativeLibrary.GetPlatform(filePath), - name, - NativeLibrary.GetDescription(filePath).replace("\n", " "), - NativeLibrary.GetCountry(filePath), - filePath, - NativeLibrary.GetGameId(filePath), - NativeLibrary.GetCompany(filePath)); - - // Try to update an existing game first. - int rowsMatched = database.update(TABLE_NAME_GAMES, // Which table to update. - game, // The values to fill the row with. - KEY_GAME_ID + " = ?", // The WHERE clause used to find the right row. - new String[]{game.getAsString(KEY_GAME_ID)}); // The ? in WHERE clause is replaced with this, - // which is provided as an array because there - // could potentially be more than one argument. - - // If update fails, insert a new game instead. - if (rowsMatched == 0) - { - Log.v("DolphinEmu", "Adding game: " + game.getAsString(KEY_GAME_TITLE)); - database.insert(TABLE_NAME_GAMES, null, game); - } - else - { - Log.v("DolphinEmu", "Updated game: " + game.getAsString(KEY_GAME_TITLE)); + String name = NativeLibrary.GetTitle(filePath); + + // If the game's title field is empty, use the filename. + if (name.isEmpty()) + { + name = filePath.substring(filePath.lastIndexOf("/") + 1); + } + + ContentValues game = Game.asContentValues(NativeLibrary.GetPlatform(filePath), + name, + NativeLibrary.GetDescription(filePath).replace("\n", " "), + NativeLibrary.GetCountry(filePath), + filePath, + NativeLibrary.GetGameId(filePath), + NativeLibrary.GetCompany(filePath)); + + // Try to update an existing game first. + int rowsMatched = database.update(TABLE_NAME_GAMES, // Which table to update. + game, // The values to fill the row with. + KEY_GAME_ID + " = ?", // The WHERE clause used to find the right row. + new String[]{game.getAsString(KEY_GAME_ID)}); // The ? in WHERE clause is replaced with this, + // which is provided as an array because there + // could potentially be more than one argument. + + // If update fails, insert a new game instead. + if (rowsMatched == 0) + { + Log.v("DolphinEmu", "Adding game: " + game.getAsString(KEY_GAME_TITLE)); + database.insert(TABLE_NAME_GAMES, null, game); + } + else + { + Log.v("DolphinEmu", "Updated game: " + game.getAsString(KEY_GAME_TITLE)); + } } } } } } + // If the folder is empty because it no longer exists, remove it from the library. + else if (!folder.exists()) + { + Log.e("DolphinEmu", "Folder no longer exists. Removing from the library: " + folderPath); + database.delete(TABLE_NAME_FOLDERS, + KEY_DB_ID + " = ?", + new String[]{Long.toString(folderCursor.getLong(COLUMN_DB_ID))}); + } + else + { + Log.e("DolphinEmu", "Folder contains no games: " + folderPath); + } } - cursor.close(); + + folderCursor.close(); database.close(); } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/GameProvider.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/GameProvider.java index 0ee2d3928e..dd83851a91 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/GameProvider.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/GameProvider.java @@ -98,6 +98,7 @@ public final class GameProvider extends ContentProvider { if (table.equals(REFRESH_LIBRARY)) { + Log.i("DolphinEmu", "URI specified table REFRESH_LIBRARY. No insertion necessary; refreshing library contents..."); mDbHelper.scanLibrary(database); return uri; } |
