Fixing modeling issues + migration

dev
Laurent 7 years ago
parent acb31d4e58
commit fe1b2a3223
  1. 2
      app/build.gradle
  2. 42
      app/src/main/java/net/pokeranalytics/android/model/migrations/PokerAnalyticsMigration.kt
  3. 34
      app/src/main/java/net/pokeranalytics/android/model/realm/CustomField.kt
  4. 35
      app/src/main/java/net/pokeranalytics/android/model/realm/CustomFieldEntry.kt
  5. 4
      app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt

@ -28,7 +28,7 @@ android {
applicationId "net.pokeranalytics.android"
minSdkVersion 23
targetSdkVersion 28
versionCode 27
versionCode 29
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

@ -2,8 +2,6 @@ package net.pokeranalytics.android.model.migrations
import io.realm.DynamicRealm
import io.realm.RealmMigration
import net.pokeranalytics.android.model.realm.CustomField
import net.pokeranalytics.android.model.realm.CustomFieldEntry
import timber.log.Timber
@ -103,34 +101,42 @@ class PokerAnalyticsMigration : RealmMigration {
it.addField("year", Integer::class.java)
it.addField("dayOfMonth", Integer::class.java)
}
schema.create("CustomFieldEntry")?.let {
val cfEntry = schema.create("CustomFieldEntry")?.let {
it.addField("id", String::class.java).setRequired("id", true)
it.addPrimaryKey("id")
it.addField("value", String::class.java).setNullable("value", false)
it.addField("order", Integer::class.java).setNullable("order", false)
it.addField("customField", CustomField::class.java).setNullable("customField", false)
// it.addRealmObjectField("customField", it).setNullable("customField", false)
it.addField("numericValue", Double::class.java).setNullable("numericValue", true)
}
schema.get("CustomField")?.let {
it.addField("type", Integer::class.java).setNullable("type", false)
it.addField("duplicateValue", Boolean::class.java)
it.addField("sortCondition", Integer::class.java)
it.addRealmListField("entries", CustomFieldEntry::class.java)
cfEntry?.let { customFieldEntrySchema ->
schema.get("CustomField")?.let {
it.addField("type", Integer::class.java).setNullable("type", false)
it.addField("duplicateValue", Boolean::class.java)
it.addField("sortCondition", Integer::class.java).setRequired("sortCondition", true)
it.addRealmListField("entries", customFieldEntrySchema)
}
schema.get("Session")?.let {
it.addField("startDateHourMinuteComponent", Double::class.java)
.setNullable("startDateHourMinuteComponent", true)
it.addField("endDateHourMinuteComponent", Double::class.java)
.setNullable("endDateHourMinuteComponent", true)
it.addRealmListField("customFieldEntries", customFieldEntrySchema)
}
}
schema.get("ReportSetup")?.let {
it.addRealmListField("statIds", Int::class.java)
it.addRealmListField("criteriaIds", Int::class.java)
it.addRealmListField("statIds", Int::class.java).setNullable("statIds", true)
it.addRealmListField("criteriaIds", Int::class.java).setNullable("criteriaIds", true)
it.removeField("filters")
schema.get("Filter")?.let { filterSchema ->
it.addRealmObjectField("filter", filterSchema)
}
}
schema.get("Session")?.let {
it.addField("startDateHourMinuteComponent", Double::class.java)
.setNullable("startDateHourMinuteComponent", true)
it.addField("endDateHourMinuteComponent", Double::class.java)
.setNullable("endDateHourMinuteComponent", true)
it.addRealmListField("customFieldEntries", CustomFieldEntry::class.java)
}
schema.get("Filter")?.addField("filterableTypeOrdinal", Integer::class.java)
schema.get("Filter")?.addField("useCount", Int::class.java)

@ -28,12 +28,19 @@ import kotlin.collections.ArrayList
open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDataSource, RowRepresentable {
enum class Type(override var uniqueIdentifier: Int, var resId: Int, var isEnabled: Boolean = true) : IntIdentifiable {
/**
* The custom field type: a list of items, a number or an amont
*/
enum class Type(override var uniqueIdentifier: Int, var resId: Int, var isEnabled: Boolean = true) :
IntIdentifiable {
LIST(0, R.string.enum_custom_field_type),
NUMBER(1, R.string.number),
AMOUNT(2, R.string.amount)
}
/**
* The sorting used for the list, either custom, or alphabetically asc/desc
*/
enum class Sort(override var uniqueIdentifier: Int) : IntIdentifiable {
DEFAULT(0),
ASCENDING(1),
@ -43,18 +50,31 @@ open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDa
@PrimaryKey
override var id = UUID.randomUUID().toString()
// The name of the currency field
/**
* The name of the custom field
*/
override var name: String = ""
// Migration
// The type of the custom fields, mapped with the CustomField.Type enum
var type: Int = Type.LIST.uniqueIdentifier
set(value) {
field = value
this.updateRowRepresentation()
}
/**
* Indicates whether the custom field value should be copied when a session is duplicated
*/
var duplicateValue: Boolean = false
/**
* The list of entries for the LIST type
*/
var entries: RealmList<CustomFieldEntry> = RealmList()
/**
* The sorting of the entries, mapped with the CustomField.Sort enum
*/
var sortCondition: Int = Sort.DEFAULT.uniqueIdentifier
set(value) {
field = value
@ -62,7 +82,6 @@ open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDa
updateRowRepresentation()
}
@Ignore
private var entriesToDelete: ArrayList<CustomFieldEntry> = ArrayList()
@ -118,7 +137,8 @@ open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDa
}
override fun alreadyExists(realm: Realm): Boolean {
return realm.where(this::class.java).equalTo("name", this.name).and().notEqualTo("id", this.id).findAll().isNotEmpty()
return realm.where(this::class.java).equalTo("name", this.name).and().notEqualTo("id", this.id).findAll()
.isNotEmpty()
}
override fun isValidForDelete(realm: Realm): Boolean {
@ -223,8 +243,8 @@ open class CustomField : RealmObject(), NameManageable, StaticRowRepresentableDa
*/
fun addEntry(): CustomFieldEntry {
val entry = CustomFieldEntry()
entry.customField = this
entries.add(entry)
// entry.customField = this
this.entries.add(entry)
sortEntries()
updateRowRepresentation()
return entry

@ -4,7 +4,9 @@ import android.content.Context
import android.text.InputType
import io.realm.Realm
import io.realm.RealmObject
import io.realm.RealmResults
import io.realm.annotations.Ignore
import io.realm.annotations.LinkingObjects
import io.realm.annotations.PrimaryKey
import io.realm.kotlin.where
import net.pokeranalytics.android.R
@ -23,14 +25,37 @@ import java.util.Currency
open class CustomFieldEntry : RealmObject(), NameManageable, RowRepresentable {
@PrimaryKey
override var id = UUID.randomUUID().toString()
/**
* The order in the list
*/
var order: Int = 0
var customField: CustomField? = null
/**
* The inverse relationship with CustomField
*/
@LinkingObjects("entries")
val customFields: RealmResults<CustomField>? = null
val customField: CustomField?
get() {
return this.customFields?.first()
}
/**
* The string value of the entry
*/
var value: String = ""
/**
* The numeric value of the entry
*/
var numericValue: Double? = null
@Ignore
override var name: String = value
get() { return value }
@ -108,14 +133,10 @@ open class CustomFieldEntry : RealmObject(), NameManageable, RowRepresentable {
fun getFormattedValue(currency: Currency? = null): String {
return when (customField?.type) {
CustomField.Type.AMOUNT.uniqueIdentifier -> {
numericValue?.let {
it.toCurrency(currency)
} ?: run { NULL_TEXT }
numericValue?.toCurrency(currency) ?: run { NULL_TEXT }
}
CustomField.Type.NUMBER.uniqueIdentifier -> {
numericValue?.let {
it.toString()
} ?: run { NULL_TEXT }
numericValue?.toString() ?: run { NULL_TEXT }
}
else -> {
value

@ -15,7 +15,6 @@ import net.pokeranalytics.android.R
import net.pokeranalytics.android.calculus.ComputedStat
import net.pokeranalytics.android.calculus.Stat
import net.pokeranalytics.android.calculus.StatFormattingException
import net.pokeranalytics.android.util.TextFormat
import net.pokeranalytics.android.exceptions.ModelException
import net.pokeranalytics.android.model.Limit
import net.pokeranalytics.android.model.TableSize
@ -36,6 +35,7 @@ import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepres
import net.pokeranalytics.android.ui.view.rowrepresentable.SeparatorRow
import net.pokeranalytics.android.ui.view.rowrepresentable.SessionRow
import net.pokeranalytics.android.util.NULL_TEXT
import net.pokeranalytics.android.util.TextFormat
import net.pokeranalytics.android.util.UserDefaults
import net.pokeranalytics.android.util.extensions.*
import java.text.DateFormat
@ -1024,9 +1024,9 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat
CustomField.Type.NUMBER.uniqueIdentifier -> {
if (value != null) {
val customFieldEntry = CustomFieldEntry()
customFieldEntry.customField = row
customFieldEntry.numericValue = value as Double?
customFieldEntries.add(customFieldEntry)
row.entries.add(customFieldEntry)
}
}
CustomField.Type.LIST.uniqueIdentifier -> {

Loading…
Cancel
Save