From fbe60150d51c4ed94be57d9f419309356c24357d Mon Sep 17 00:00:00 2001 From: Tom Hicks Date: Sat, 17 Apr 2021 14:33:49 -0700 Subject: [PATCH] Creates initial app database class and adds minimal DTO support for monsters. --- .../1.json | 41 +++++++++++ .../majinnaibu/monstercards/AppDatabase.java | 15 ++++ .../converters/UUIDConverter.java | 18 +++++ .../monstercards/data/MonsterDAO.java | 32 +++++++++ .../monstercards/models/Monster.java | 69 ++++++++++++++++--- .../ui/monster/MonsterFragment.java | 2 +- .../ui/monster/MonsterViewModel.java | 2 +- 7 files changed, 167 insertions(+), 12 deletions(-) create mode 100644 app/schemas/com.majinnaibu.monstercards.AppDatabase/1.json create mode 100644 app/src/main/java/com/majinnaibu/monstercards/AppDatabase.java create mode 100644 app/src/main/java/com/majinnaibu/monstercards/converters/UUIDConverter.java create mode 100644 app/src/main/java/com/majinnaibu/monstercards/data/MonsterDAO.java diff --git a/app/schemas/com.majinnaibu.monstercards.AppDatabase/1.json b/app/schemas/com.majinnaibu.monstercards.AppDatabase/1.json new file mode 100644 index 0000000..f92e587 --- /dev/null +++ b/app/schemas/com.majinnaibu.monstercards.AppDatabase/1.json @@ -0,0 +1,41 @@ +{ + "formatVersion": 1, + "database": { + "version": 1, + "identityHash": "a9371223372fb64522cc40f5529ada09", + "entities": [ + { + "tableName": "Monster", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `name` TEXT NOT NULL DEFAULT '', PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "''" + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": false + }, + "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, 'a9371223372fb64522cc40f5529ada09')" + ] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/majinnaibu/monstercards/AppDatabase.java b/app/src/main/java/com/majinnaibu/monstercards/AppDatabase.java new file mode 100644 index 0000000..fc44923 --- /dev/null +++ b/app/src/main/java/com/majinnaibu/monstercards/AppDatabase.java @@ -0,0 +1,15 @@ +package com.majinnaibu.monstercards; + +import androidx.room.Database; +import androidx.room.RoomDatabase; +import androidx.room.TypeConverters; + +import com.majinnaibu.monstercards.converters.UUIDConverter; +import com.majinnaibu.monstercards.data.MonsterDAO; +import com.majinnaibu.monstercards.models.Monster; + +@Database(entities = {Monster.class}, version=1) +@TypeConverters({UUIDConverter.class}) +public abstract class AppDatabase extends RoomDatabase { + public abstract MonsterDAO monsterDAO(); +} diff --git a/app/src/main/java/com/majinnaibu/monstercards/converters/UUIDConverter.java b/app/src/main/java/com/majinnaibu/monstercards/converters/UUIDConverter.java new file mode 100644 index 0000000..b1effc8 --- /dev/null +++ b/app/src/main/java/com/majinnaibu/monstercards/converters/UUIDConverter.java @@ -0,0 +1,18 @@ +package com.majinnaibu.monstercards.converters; + +import androidx.room.TypeConverter; + +import java.util.UUID; + +public class UUIDConverter { + + @TypeConverter + public static String fromUUID(UUID uuid) { + return uuid.toString(); + } + + @TypeConverter + public static UUID uuidFromString(String string) { + return UUID.fromString(string); + } +} diff --git a/app/src/main/java/com/majinnaibu/monstercards/data/MonsterDAO.java b/app/src/main/java/com/majinnaibu/monstercards/data/MonsterDAO.java new file mode 100644 index 0000000..5295e92 --- /dev/null +++ b/app/src/main/java/com/majinnaibu/monstercards/data/MonsterDAO.java @@ -0,0 +1,32 @@ +package com.majinnaibu.monstercards.data; + + +import androidx.room.Dao; +import androidx.room.Delete; +import androidx.room.Insert; +import androidx.room.Query; + +import com.majinnaibu.monstercards.models.Monster; + +import java.util.List; + +import io.reactivex.rxjava3.core.Completable; +import io.reactivex.rxjava3.core.Flowable; + +@Dao +public interface MonsterDAO { + @Query("SELECT * FROM monster") + Flowable> getAll(); + + @Query("SELECT * FROM monster WHERE id IN (:monsterIds)") + Flowable> loadAllByIds(String[] monsterIds); + + @Query("SELECT * FROM monster WHERE name LIKE :name LIMIT 1") + Flowable findByName(String name); + + @Insert + Completable insertAll(Monster... monsters); + + @Delete + Completable delete(Monster monster); +} diff --git a/app/src/main/java/com/majinnaibu/monstercards/models/Monster.java b/app/src/main/java/com/majinnaibu/monstercards/models/Monster.java index 690e881..e755fed 100644 --- a/app/src/main/java/com/majinnaibu/monstercards/models/Monster.java +++ b/app/src/main/java/com/majinnaibu/monstercards/models/Monster.java @@ -1,5 +1,11 @@ package com.majinnaibu.monstercards.models; +import androidx.annotation.NonNull; +import androidx.room.ColumnInfo; +import androidx.room.Entity; +import androidx.room.Ignore; +import androidx.room.PrimaryKey; + import com.majinnaibu.monstercards.helpers.StringHelper; import java.util.ArrayList; @@ -9,10 +15,21 @@ import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Set; +import java.util.UUID; +@Entity public class Monster { + @PrimaryKey + @NonNull + public UUID id; + + @NonNull + @ColumnInfo(defaultValue = "") + public String name; + public Monster() { + name = ""; mAbilities = new ArrayList<>(); mActions = new ArrayList<>(); mConditionImmunities = new HashSet<>(); @@ -22,16 +39,7 @@ public class Monster { mSkills = new HashSet<>(); } - private String mName; - - public String getName() { - return mName; - } - - public void setName(String value) { - mName = value; - } - + @Ignore() private String mSize; public String getSize() { @@ -42,6 +50,7 @@ public class Monster { mSize = value; } + @Ignore() private String mType; public String getType() { @@ -52,6 +61,7 @@ public class Monster { mType = value; } + @Ignore() private String mTag; public String getTag() { @@ -62,6 +72,7 @@ public class Monster { mTag = value; } + @Ignore() private String mAlignment; public String getAlignment() { @@ -139,6 +150,7 @@ public class Monster { return getAbilityModifierForScore(score); } + @Ignore() private int mStrengthScore; public int getStrengthScore() { @@ -153,6 +165,7 @@ public class Monster { return getAbilityModifierForScore(getStrengthScore()); } + @Ignore() private int mDexterityScore; public int getDexterityScore() { @@ -167,6 +180,7 @@ public class Monster { return getAbilityModifierForScore(getDexterityScore()); } + @Ignore() private int mConstitutionScore; public int getConstitutionScore() { @@ -181,6 +195,7 @@ public class Monster { return getAbilityModifierForScore(getConstitutionScore()); } + @Ignore() private int mIntelligenceScore; public int getIntelligenceScore() { @@ -195,6 +210,7 @@ public class Monster { return getAbilityModifierForScore(getIntelligenceScore()); } + @Ignore() private int mWisdomScore; public int getWisdomScore() { @@ -209,6 +225,7 @@ public class Monster { return getAbilityModifierForScore(getWisdomScore()); } + @Ignore() private int mCharismaScore; public int getCharismaScore() { @@ -223,6 +240,7 @@ public class Monster { return getAbilityModifierForScore(getCharismaScore()); } + @Ignore() private String mArmorName; public String getArmorName() { @@ -233,6 +251,7 @@ public class Monster { mArmorName = value; } + @Ignore() private int mShieldBonus; public int getShieldBonus() { @@ -243,6 +262,7 @@ public class Monster { mShieldBonus = value; } + @Ignore() private int mNaturalArmorBonus; public int getNaturalArmorBonus() { @@ -253,6 +273,7 @@ public class Monster { mNaturalArmorBonus = value; } + @Ignore() private String mOtherArmorDescription; public String getOtherArmorDescription() { @@ -334,6 +355,7 @@ public class Monster { private static final int SPLINT_ARMOR_CLASS = BASE_ARMOR_CLASS + 7; private static final int PLATE_ARMOR_CLASS = BASE_ARMOR_CLASS + 8; + @Ignore() private int mHitDice; public int getHitDice() { @@ -344,6 +366,7 @@ public class Monster { mHitDice = value; } + @Ignore() private boolean mCustomHP; public boolean getCustomHP() { @@ -354,6 +377,7 @@ public class Monster { mCustomHP = value; } + @Ignore() private String mHPText; public String getHPText() { @@ -397,6 +421,7 @@ public class Monster { } } + @Ignore() private String mSpeed; public String getSpeed() { @@ -407,6 +432,7 @@ public class Monster { mSpeed = value; } + @Ignore() private String mBurrowSpeed; public String getBurrowSpeed() { @@ -417,6 +443,7 @@ public class Monster { mBurrowSpeed = value; } + @Ignore() private String mClimbSpeed; public String getClimbSpeed() { @@ -427,6 +454,7 @@ public class Monster { mClimbSpeed = value; } + @Ignore() private String mFlySpeed; public String getFlySpeed() { @@ -437,6 +465,7 @@ public class Monster { mFlySpeed = value; } + @Ignore() private boolean mHover; public boolean getHover() { @@ -447,6 +476,7 @@ public class Monster { mHover = value; } + @Ignore() private String mSwimSpeed; public String getSwimSpeed() { @@ -457,6 +487,7 @@ public class Monster { mSwimSpeed = value; } + @Ignore() private boolean mCustomSpeed; public boolean getCustomSpeed() { @@ -467,6 +498,7 @@ public class Monster { mCustomSpeed = value; } + @Ignore() private String mSpeedDescription; public String getSpeedDescription() { @@ -531,6 +563,7 @@ public class Monster { return String.format(Locale.US, "%d (%+d)", getCharismaScore(), getCharismaModifier()); } + @Ignore() private HashSet mSavingThrows; public Set getSavingThrows() { @@ -634,6 +667,7 @@ public class Monster { } } + @Ignore() private String mChallengeRating; public String getChallengeRating() { @@ -645,6 +679,7 @@ public class Monster { // TODO: update proficiency bonus based on CR } + @Ignore() private String mCustomChallengeRating; public String getCustomChallengeRating() { @@ -655,6 +690,7 @@ public class Monster { mCustomChallengeRating = challengeRating; } + @Ignore() private int mCustomProficiencyBonus; public int getCustomProficiencyBonus() { @@ -665,6 +701,7 @@ public class Monster { mCustomProficiencyBonus = proficiencyBonus; } + @Ignore() private HashSet mSkills; public Set getSkills() { @@ -700,6 +737,7 @@ public class Monster { return sb.toString(); } + @Ignore() private HashSet mDamageTypes; public Set getDamageTypes() { @@ -752,6 +790,7 @@ public class Monster { return StringHelper.oxfordJoin(", ", ", and ", " and ", vulnerabilities); } + @Ignore() private HashSet mConditionImmunities; public Set getConditionImmunities() { @@ -778,6 +817,7 @@ public class Monster { return StringHelper.oxfordJoin(", ", ", and ", " and ", immunities); } + @Ignore() private String mBlindsight; public String getBlindsight() { @@ -788,6 +828,7 @@ public class Monster { mBlindsight = value; } + @Ignore() private boolean mIsBlind; public boolean getIsBlind() { @@ -798,6 +839,7 @@ public class Monster { mIsBlind = value; } + @Ignore() private String mDarkvision; public String getDarkvision() { @@ -808,6 +850,7 @@ public class Monster { mDarkvision = value; } + @Ignore() private String mTremorsense; public String getTremorsense() { @@ -818,6 +861,7 @@ public class Monster { mTremorsense = value; } + @Ignore() private String mTruesight; public String getTruesight() { @@ -852,6 +896,7 @@ public class Monster { return StringHelper.join(", ", parts); } + @Ignore() private HashSet mLanguages; public Set getLanguages() { @@ -870,6 +915,7 @@ public class Monster { mLanguages.clear(); } + @Ignore() private int mTelepathy; public int getTelepathy() { @@ -880,6 +926,7 @@ public class Monster { mTelepathy = value; } + @Ignore() private String mUnderstandsBut; public String getUnderstandsBut() { @@ -1023,6 +1070,7 @@ public class Monster { } } + @Ignore() private ArrayList mAbilities; public List getAbilities() { @@ -1095,6 +1143,7 @@ public class Monster { return actions; } + @Ignore() private ArrayList mActions; public List getActions() { diff --git a/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterFragment.java b/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterFragment.java index 9a2174b..e587b77 100644 --- a/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterFragment.java +++ b/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterFragment.java @@ -43,7 +43,7 @@ public class MonsterFragment extends Fragment { // TODO: remove this block make the monster ID a parameter to the view and get the monster from saved data (sqlite) Monster monster = new Monster(); // Name - monster.setName("Pixie"); + monster.name ="Pixie"; // Meta monster.setSize("tiny"); monster.setType("fey"); diff --git a/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterViewModel.java b/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterViewModel.java index 4449896..24b507a 100644 --- a/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterViewModel.java +++ b/app/src/main/java/com/majinnaibu/monstercards/ui/monster/MonsterViewModel.java @@ -167,7 +167,7 @@ public class MonsterViewModel extends ViewModel { mIntelligence.setValue(monster.getIntelligenceDescription()); mLanguages.setValue(mMonster.getLanguagesDescription()); mMeta.setValue(mMonster.getMeta()); - mName.setValue(mMonster.getName()); + mName.setValue(mMonster.name); mSavingThrows.setValue(monster.getSavingThrowsDescription()); mSenses.setValue(monster.getSensesDescription()); mSkills.setValue(monster.getSkillsDescription());