diff --git a/db/schemas/com.readrops.db.Database/3.json b/db/schemas/com.readrops.db.Database/3.json new file mode 100644 index 00000000..bb0455d5 --- /dev/null +++ b/db/schemas/com.readrops.db.Database/3.json @@ -0,0 +1,451 @@ +{ + "formatVersion": 1, + "database": { + "version": 3, + "identityHash": "474b2c463c0a4bc9f0a8b69feb2feeec", + "entities": [ + { + "tableName": "Feed", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT, `description` TEXT, `url` TEXT, `siteUrl` TEXT, `lastUpdated` TEXT, `text_color` INTEGER NOT NULL, `background_color` INTEGER NOT NULL, `icon_url` TEXT, `etag` TEXT, `last_modified` TEXT, `folder_id` INTEGER, `remoteId` TEXT, `account_id` INTEGER NOT NULL, `notification_enabled` INTEGER NOT NULL DEFAULT 1, FOREIGN KEY(`folder_id`) REFERENCES `Folder`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`account_id`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "siteUrl", + "columnName": "siteUrl", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "lastUpdated", + "columnName": "lastUpdated", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "textColor", + "columnName": "text_color", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "backgroundColor", + "columnName": "background_color", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "iconUrl", + "columnName": "icon_url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "etag", + "columnName": "etag", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "lastModified", + "columnName": "last_modified", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "folderId", + "columnName": "folder_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "remoteId", + "columnName": "remoteId", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "accountId", + "columnName": "account_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "notificationEnabled", + "columnName": "notification_enabled", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "1" + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_Feed_folder_id", + "unique": false, + "columnNames": [ + "folder_id" + ], + "createSql": "CREATE INDEX IF NOT EXISTS `index_Feed_folder_id` ON `${TABLE_NAME}` (`folder_id`)" + }, + { + "name": "index_Feed_account_id", + "unique": false, + "columnNames": [ + "account_id" + ], + "createSql": "CREATE INDEX IF NOT EXISTS `index_Feed_account_id` ON `${TABLE_NAME}` (`account_id`)" + } + ], + "foreignKeys": [ + { + "table": "Folder", + "onDelete": "SET NULL", + "onUpdate": "NO ACTION", + "columns": [ + "folder_id" + ], + "referencedColumns": [ + "id" + ] + }, + { + "table": "Account", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "account_id" + ], + "referencedColumns": [ + "id" + ] + } + ] + }, + { + "tableName": "Item", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `title` TEXT, `description` TEXT, `clean_description` TEXT, `link` TEXT, `image_link` TEXT, `author` TEXT, `pub_date` INTEGER, `content` TEXT, `feed_id` INTEGER NOT NULL, `guid` TEXT, `read_time` REAL NOT NULL, `read` INTEGER NOT NULL, `read_changed` INTEGER NOT NULL, `starred` INTEGER NOT NULL, `starred_changed` INTEGER NOT NULL, `read_it_later` INTEGER NOT NULL, `remoteId` TEXT, FOREIGN KEY(`feed_id`) REFERENCES `Feed`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "cleanDescription", + "columnName": "clean_description", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "link", + "columnName": "link", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "imageLink", + "columnName": "image_link", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "author", + "columnName": "author", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "pubDate", + "columnName": "pub_date", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "feedId", + "columnName": "feed_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "guid", + "columnName": "guid", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "readTime", + "columnName": "read_time", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "read", + "columnName": "read", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "readChanged", + "columnName": "read_changed", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "starred", + "columnName": "starred", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "starredChanged", + "columnName": "starred_changed", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "readItLater", + "columnName": "read_it_later", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "remoteId", + "columnName": "remoteId", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_Item_feed_id", + "unique": false, + "columnNames": [ + "feed_id" + ], + "createSql": "CREATE INDEX IF NOT EXISTS `index_Item_feed_id` ON `${TABLE_NAME}` (`feed_id`)" + }, + { + "name": "index_Item_guid", + "unique": false, + "columnNames": [ + "guid" + ], + "createSql": "CREATE INDEX IF NOT EXISTS `index_Item_guid` ON `${TABLE_NAME}` (`guid`)" + }, + { + "name": "index_Item_starred_changed", + "unique": false, + "columnNames": [ + "starred_changed" + ], + "createSql": "CREATE INDEX IF NOT EXISTS `index_Item_starred_changed` ON `${TABLE_NAME}` (`starred_changed`)" + } + ], + "foreignKeys": [ + { + "table": "Feed", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "feed_id" + ], + "referencedColumns": [ + "id" + ] + } + ] + }, + { + "tableName": "Folder", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT, `remoteId` TEXT, `account_id` INTEGER NOT NULL, FOREIGN KEY(`account_id`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "remoteId", + "columnName": "remoteId", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "accountId", + "columnName": "account_id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_Folder_account_id", + "unique": false, + "columnNames": [ + "account_id" + ], + "createSql": "CREATE INDEX IF NOT EXISTS `index_Folder_account_id` ON `${TABLE_NAME}` (`account_id`)" + } + ], + "foreignKeys": [ + { + "table": "Account", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "account_id" + ], + "referencedColumns": [ + "id" + ] + } + ] + }, + { + "tableName": "Account", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `url` TEXT, `account_name` TEXT, `displayed_name` TEXT, `account_type` INTEGER, `last_modified` INTEGER NOT NULL, `current_account` INTEGER NOT NULL, `token` TEXT, `writeToken` TEXT, `notifications_enabled` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "accountName", + "columnName": "account_name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "displayedName", + "columnName": "displayed_name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "accountType", + "columnName": "account_type", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "lastModified", + "columnName": "last_modified", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "currentAccount", + "columnName": "current_account", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "token", + "columnName": "token", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "writeToken", + "columnName": "writeToken", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "notificationsEnabled", + "columnName": "notifications_enabled", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '474b2c463c0a4bc9f0a8b69feb2feeec')" + ] + } +} \ No newline at end of file diff --git a/db/src/androidTest/java/com/readrops/db/DatabaseMigrationsTest.kt b/db/src/androidTest/java/com/readrops/db/DatabaseMigrationsTest.kt index 038d02fc..5280220c 100644 --- a/db/src/androidTest/java/com/readrops/db/DatabaseMigrationsTest.kt +++ b/db/src/androidTest/java/com/readrops/db/DatabaseMigrationsTest.kt @@ -22,9 +22,14 @@ class DatabaseMigrationsTest { ) @Test - @Throws(IOException::class) fun migrate1To2() { helper.createDatabase(testDb, 1).close() helper.runMigrationsAndValidate(testDb, 2, true, Database.MIGRATION_1_2).close() } + + @Test + fun migrate2to3() { + helper.createDatabase(testDb, 2).close() + helper.runMigrationsAndValidate(testDb, 3, true, Database.MIGRATION_2_3).close() + } } \ No newline at end of file diff --git a/db/src/main/java/com/readrops/db/Database.java b/db/src/main/java/com/readrops/db/Database.java index 3d23536a..9f5c1fa4 100644 --- a/db/src/main/java/com/readrops/db/Database.java +++ b/db/src/main/java/com/readrops/db/Database.java @@ -16,7 +16,7 @@ import com.readrops.db.entities.Item; import com.readrops.db.entities.account.Account; -@androidx.room.Database(entities = {Feed.class, Item.class, Folder.class, Account.class}, version = 2) +@androidx.room.Database(entities = {Feed.class, Item.class, Folder.class, Account.class}, version = 3) @TypeConverters({Converters.class}) public abstract class Database extends RoomDatabase { @@ -36,4 +36,14 @@ public abstract class Database extends RoomDatabase { database.execSQL("Alter Table Feed Add Column notification_enabled INTEGER Not Null Default 1"); } }; + + public static final Migration MIGRATION_2_3 = new Migration(2, 3) { + @Override + public void migrate(@NonNull SupportSQLiteDatabase database) { + database.execSQL("Alter Table Item Add Column starred INTEGER Not Null Default 0"); + database.execSQL("Alter Table Item Add Column starred_changed INTEGER Not Null Default 0"); + + database.execSQL("CREATE INDEX `index_Item_starred_changed` ON `Item` (`starred_changed`);"); + } + }; } \ No newline at end of file diff --git a/db/src/main/java/com/readrops/db/entities/Item.java b/db/src/main/java/com/readrops/db/entities/Item.java index a56f01a7..3194f505 100644 --- a/db/src/main/java/com/readrops/db/entities/Item.java +++ b/db/src/main/java/com/readrops/db/entities/Item.java @@ -50,6 +50,11 @@ public class Item implements Comparable { @ColumnInfo(name = "read_changed") private boolean readChanged; + private boolean starred; + + @ColumnInfo(name = "starred_changed", index = true) + private boolean starredChanged; + @ColumnInfo(name = "read_it_later") private boolean readItLater; @@ -181,6 +186,22 @@ public class Item implements Comparable { this.readChanged = readChanged; } + public boolean isStarred() { + return starred; + } + + public void setStarred(boolean starred) { + this.starred = starred; + } + + public boolean isStarredChanged() { + return starredChanged; + } + + public void setStarredChanged(boolean starredChanged) { + this.starredChanged = starredChanged; + } + public boolean isReadItLater() { return readItLater; }