Added Import delete functions

csv
Laurent 6 years ago
parent fa61d76b71
commit b87dce5b75
  1. 67
      app/src/main/java/net/pokeranalytics/android/model/LiveData.kt
  2. 22
      app/src/main/java/net/pokeranalytics/android/model/interfaces/Manageable.kt
  3. 26
      app/src/main/java/net/pokeranalytics/android/model/realm/IdentifiableObject.kt
  4. 19
      app/src/main/java/net/pokeranalytics/android/model/realm/Import.kt
  5. 10
      app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt
  6. 2
      app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt
  7. 2
      app/src/main/java/net/pokeranalytics/android/ui/fragment/data/DataManagerFragment.kt
  8. 25
      app/src/main/java/net/pokeranalytics/android/util/csv/CSVDescriptor.kt

@ -3,46 +3,44 @@ package net.pokeranalytics.android.model
import android.content.Context
import io.realm.Realm
import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.interfaces.Deletable
import net.pokeranalytics.android.model.interfaces.Identifiable
import net.pokeranalytics.android.model.realm.*
import net.pokeranalytics.android.ui.view.Localizable
import net.pokeranalytics.android.util.enumerations.IntIdentifiable
import net.pokeranalytics.android.util.enumerations.IntSearchable
import net.pokeranalytics.android.util.extensions.findById
/**
* An enum managing the business objects related to a realm results
*/
enum class LiveData : Localizable {
BANKROLL,
GAME,
LOCATION,
TOURNAMENT_NAME,
TOURNAMENT_FEATURE,
TRANSACTION,
TRANSACTION_TYPE,
FILTER,
CUSTOM_FIELD,
REPORT_SETUP;
var subType:Int? = null
enum class LiveData(override var uniqueIdentifier: Int, val relatedEntity: Class<out Identifiable>) : Localizable, IntIdentifiable {
BANKROLL(0, Bankroll::class.java),
GAME(1, Game::class.java),
LOCATION(2, Location::class.java),
TOURNAMENT_NAME(3, TournamentName::class.java),
TOURNAMENT_FEATURE(4, TournamentFeature::class.java),
TRANSACTION(5, Transaction::class.java),
TRANSACTION_TYPE(6, TransactionType::class.java),
FILTER(7, Filter::class.java),
CUSTOM_FIELD(8, CustomField::class.java),
REPORT_SETUP(9, ReportSetup::class.java),
SESSION(10, Session::class.java);
companion object : IntSearchable<LiveData> {
override fun valuesInternal(): Array<LiveData> {
return values()
}
val relatedEntity: Class<out Deletable>
get() {
return when (this) {
BANKROLL -> Bankroll::class.java
GAME -> Game::class.java
LOCATION -> Location::class.java
TOURNAMENT_NAME -> TournamentName::class.java
TOURNAMENT_FEATURE -> TournamentFeature::class.java
TRANSACTION -> Transaction::class.java
TRANSACTION_TYPE -> TransactionType::class.java
FILTER -> Filter::class.java
CUSTOM_FIELD -> CustomField::class.java
REPORT_SETUP -> ReportSetup::class.java
}
fun valueFromClass(clazz: Class<out Identifiable>) : LiveData? {
return values().firstOrNull { it.relatedEntity == clazz }
}
}
var subType:Int? = null
fun updateOrCreate(realm: Realm, primaryKey: String?): Deletable {
val proxyItem: Deletable? = this.getData(realm, primaryKey)
fun updateOrCreate(realm: Realm, primaryKey: String?): Identifiable {
val proxyItem: Identifiable? = this.getData(realm, primaryKey)
proxyItem?.let {
return realm.copyFromRealm(it)
} ?: run {
@ -50,12 +48,12 @@ enum class LiveData : Localizable {
}
}
private fun newEntity(): Deletable {
private fun newEntity(): Identifiable {
return this.relatedEntity.newInstance()
}
fun getData(realm: Realm, primaryKey: String?): Deletable? {
var proxyItem: Deletable? = null
fun getData(realm: Realm, primaryKey: String?): Identifiable? {
var proxyItem: Identifiable? = null
primaryKey?.let {
val t = realm.findById(this.relatedEntity, it)
t?.let {
@ -78,6 +76,7 @@ enum class LiveData : Localizable {
FILTER -> R.string.filter
CUSTOM_FIELD -> R.string.custom_field
REPORT_SETUP -> R.string.custom
SESSION -> R.string.session
}
}
@ -94,6 +93,7 @@ enum class LiveData : Localizable {
FILTER -> R.string.filters
CUSTOM_FIELD -> R.string.custom_fields
REPORT_SETUP -> R.string.custom
SESSION -> R.string.sessions
}
}
@ -110,6 +110,7 @@ enum class LiveData : Localizable {
FILTER -> R.string.new_filter
CUSTOM_FIELD -> R.string.new_custom_field
REPORT_SETUP -> R.string.new_report
else -> R.string.none
}
}

@ -5,6 +5,9 @@ import io.realm.Realm
import io.realm.RealmModel
import net.pokeranalytics.android.R
import net.pokeranalytics.android.exceptions.ModelException
import net.pokeranalytics.android.exceptions.PAIllegalStateException
import net.pokeranalytics.android.model.LiveData
import net.pokeranalytics.android.model.realm.IdentifiableObject
import net.pokeranalytics.android.ui.view.RowRepresentable
enum class SaveValidityStatus {
@ -45,7 +48,24 @@ interface NameManageable : Manageable {
}
}
class ObjectIdentifier(var id: String, var clazz: Class<out Identifiable>)
class ObjectIdentifier(var id: String, var clazz: Class<out Identifiable>) {
val identifiableObject: IdentifiableObject
get() {
val livedata = LiveData.valueFromClass(this.clazz)
livedata?.let {
val io = IdentifiableObject()
io.id = this.id
io.classId = it.uniqueIdentifier
return io
} ?: run {
throw PAIllegalStateException("clazz $clazz has no corresponding LiveData value")
}
}
}
/**
* An interface associate a unique uniqueIdentifier to an object

@ -0,0 +1,26 @@
package net.pokeranalytics.android.model.realm
import io.realm.RealmModel
import io.realm.RealmObject
import net.pokeranalytics.android.model.LiveData
import net.pokeranalytics.android.util.extensions.findById
open class IdentifiableObject : RealmObject() {
/**
* The id of an Identifiable object
*/
var id: String = ""
/**
* The uniqueIdentifier of the LiveData object
*/
var classId: Int = 0
val realmModel: RealmModel?
get() {
val clazz = LiveData.valueByIdentifier(this.classId).relatedEntity
return this.realm.findById(clazz, id)
}
}

@ -2,6 +2,7 @@ package net.pokeranalytics.android.model.realm
import io.realm.RealmList
import io.realm.RealmObject
import io.realm.kotlin.deleteFromRealm
import java.util.*
open class Import : RealmObject() {
@ -10,19 +11,25 @@ open class Import : RealmObject() {
var fileName: String = ""
var sessions: RealmList<Session> = RealmList()
var transactions: RealmList<Transaction> = RealmList()
var identifiableObjects: RealmList<IdentifiableObject> = RealmList()
fun delete() {
this.realm.executeTransaction {
this.sessions.forEach {
it.cleanup()
it.deleteFromRealm()
this.identifiableObjects.forEach {
val realmModel = it.realmModel
when (realmModel) {
is Session -> {
realmModel.cleanup()
}
else -> {}
}
realmModel?.deleteFromRealm()
}
transactions.deleteAllFromRealm()
}
}

@ -45,7 +45,7 @@ import kotlin.collections.ArrayList
typealias BB = Double
open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDataSource, RowRepresentable, Timed,
open class Session : RealmObject(), Manageable, StaticRowRepresentableDataSource, RowRepresentable, Timed,
TimeFilterable, Filterable, DatedBankrollGraphEntry {
enum class Type {
@ -493,6 +493,14 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat
return R.string.no_br_popup_message
}
override fun getFailedDeleteMessage(status: DeleteValidityStatus): Int {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun isValidForDelete(realm: Realm): Boolean {
return true
}
// States
/**

@ -47,7 +47,7 @@ open class DataListFragment : DeletableItemFragment(), LiveRowRepresentableDataS
open fun setData(dataType: Int) {
this.dataType = LiveData.values()[dataType]
this.identifiableClass = this.dataType.relatedEntity
this.identifiableClass = this.dataType.relatedEntity as Class<out Deletable>
setToolbarTitle(this.dataType.pluralLocalizedTitle(requireContext()))
this.items = this.retrieveItems(getRealm())

@ -75,7 +75,7 @@ open class DataManagerFragment : RealmFragment() {
*/
private fun loadItem() {
this.item = this.liveDataType.updateOrCreate(this.getRealm(), primaryKey)
this.item = this.liveDataType.updateOrCreate(this.getRealm(), primaryKey) as Deletable
this.deleteButtonShouldAppear = this.primaryKey != null
}

@ -1,13 +1,9 @@
package net.pokeranalytics.android.util.csv
import io.realm.Realm
import io.realm.kotlin.deleteFromRealm
import net.pokeranalytics.android.model.interfaces.Identifiable
import net.pokeranalytics.android.model.interfaces.ObjectIdentifier
import net.pokeranalytics.android.model.realm.CustomField
import net.pokeranalytics.android.model.realm.Import
import net.pokeranalytics.android.model.realm.Session
import net.pokeranalytics.android.util.extensions.findById
import org.apache.commons.csv.CSVRecord
import timber.log.Timber
import java.text.NumberFormat
@ -27,25 +23,19 @@ enum class DataSource {
*/
abstract class DataCSVDescriptor<T : Identifiable>(source: DataSource, vararg elements: CSVField) : CSVDescriptor(source, *elements) {
/**
* List of Realm object identificators
*/
private val realmModelIds = mutableListOf<ObjectIdentifier>()
abstract fun parseData(realm: Realm, record: CSVRecord): T?
override fun parse(realm: Realm, record: CSVRecord): Int {
val data = this.parseData(realm, record)
data?.let {
// Timber.d(">>>>>>> identifier added: ${it.id}")
this.realmModelIds.add(it.objectIdentifier)
this.import.identifiableObjects.add(it.objectIdentifier.identifiableObject)
}
return if (data != null) 1 else 0
}
protected fun addAdditionallyCreatedIdentifiable(identifiable: Identifiable) {
this.realmModelIds.add(identifiable.objectIdentifier)
this.import.identifiableObjects.add(identifiable.objectIdentifier.identifiableObject)
}
override fun cancel(realm: Realm) {
@ -61,20 +51,11 @@ abstract class DataCSVDescriptor<T : Identifiable>(source: DataSource, vararg el
}
private fun deleteInsertedFromRealm(realm: Realm) {
this.realmModelIds.forEach { identifier ->
val data = realm.findById(identifier.clazz, identifier.id)
if (data is Session) {
data.cleanup()
}
data?.deleteFromRealm()
}
this.realmModelIds.clear()
this.import.delete()
}
override fun save(realm: Realm) {
super.save(realm)
this.realmModelIds.clear()
}
}

Loading…
Cancel
Save